emdash 0.13.0 → 0.15.0
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/{adapters-9DybjTO6.d.mts → adapters-C4yd_UJR.d.mts} +1 -1
- package/dist/{adapters-9DybjTO6.d.mts.map → adapters-C4yd_UJR.d.mts.map} +1 -1
- package/dist/{allowed-origins-CDdG-4Gd.mjs → allowed-origins-D0fFk9a6.mjs} +2 -2
- package/dist/{allowed-origins-CDdG-4Gd.mjs.map → allowed-origins-D0fFk9a6.mjs.map} +1 -1
- package/dist/api/route-utils.d.mts +3 -3
- package/dist/api/route-utils.mjs +15 -15
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +3 -3
- package/dist/{api-ayIQ7rIe.mjs → api-CLwG_3dh.mjs} +523 -59
- package/dist/api-CLwG_3dh.mjs.map +1 -0
- package/dist/{api-tokens-eYymBhIT.mjs → api-tokens-ucpcNXDt.mjs} +2 -2
- package/dist/{api-tokens-eYymBhIT.mjs.map → api-tokens-ucpcNXDt.mjs.map} +1 -1
- package/dist/{apply-v4DBgjPw.mjs → apply-wJhM_bwU.mjs} +17 -17
- package/dist/{apply-v4DBgjPw.mjs.map → apply-wJhM_bwU.mjs.map} +1 -1
- package/dist/astro/index.d.mts +10 -10
- package/dist/astro/index.mjs +21 -5
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +9 -9
- package/dist/astro/middleware/auth.mjs +6 -6
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.mjs +4 -4
- package/dist/astro/middleware/request-context.mjs +2 -2
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +353 -71
- package/dist/astro/middleware.mjs.map +1 -1
- 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 +5 -5
- package/dist/astro/routes/api/admin/bylines/_id_/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +14 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts +9 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +70 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs.map +1 -0
- package/dist/astro/routes/api/admin/bylines/index.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/bylines/index.mjs +25 -16
- package/dist/astro/routes/api/admin/bylines/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +8 -8
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +8 -8
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +4 -4
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +4 -4
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +32 -31
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +33 -31
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +3 -3
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +33 -31
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +59 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts +8 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.d.mts.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +72 -0
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -0
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +31 -30
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.d.mts.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +44 -31
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +31 -30
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +3 -3
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +31 -30
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- 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 +2 -2
- 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 +3 -3
- package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -8
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +5 -5
- 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_/callback.mjs.map +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs.map +1 -1
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +2 -2
- 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/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 +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +10 -9
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +3 -3
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/index.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
- package/dist/astro/routes/api/dashboard.mjs +7 -7
- package/dist/astro/routes/api/dev/emails.mjs +3 -3
- 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 +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +9 -9
- package/dist/astro/routes/api/import/wordpress/execute.mjs +9 -8
- package/dist/astro/routes/api/import/wordpress/execute.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +8 -8
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +8 -8
- package/dist/astro/routes/api/import/wordpress/prepare.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +7 -7
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs.map +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +11 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs.map +1 -1
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +29 -29
- package/dist/astro/routes/api/mcp.mjs.map +1 -1
- package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -6
- package/dist/astro/routes/api/media/_id_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +3 -3
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +3 -3
- package/dist/astro/routes/api/media/providers/index.mjs +3 -3
- package/dist/astro/routes/api/media/upload-url.mjs +7 -7
- package/dist/astro/routes/api/media/upload-url.mjs.map +1 -1
- package/dist/astro/routes/api/media.mjs +8 -8
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/items.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_/translations.mjs +7 -7
- package/dist/astro/routes/api/menus/_name_.mjs +7 -7
- package/dist/astro/routes/api/menus/index.mjs +7 -7
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- 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 +3 -3
- 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 +3 -3
- package/dist/astro/routes/api/openapi.json.mjs.map +1 -1
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/index.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/404s/summary.mjs +8 -8
- package/dist/astro/routes/api/redirects/404s/summary.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/_id_.mjs +9 -9
- package/dist/astro/routes/api/redirects/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/redirects/index.mjs +9 -9
- package/dist/astro/routes/api/redirects/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +3 -3
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +3 -3
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +31 -30
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +6 -6
- package/dist/astro/routes/api/schema/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +31 -30
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +31 -30
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +9 -9
- package/dist/astro/routes/api/search/index.mjs +8 -8
- package/dist/astro/routes/api/search/rebuild.mjs +9 -9
- package/dist/astro/routes/api/search/stats.mjs +6 -6
- package/dist/astro/routes/api/search/suggest.mjs +8 -8
- package/dist/astro/routes/api/sections/_slug_.mjs +8 -8
- package/dist/astro/routes/api/sections/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/sections/index.mjs +8 -8
- package/dist/astro/routes/api/sections/index.mjs.map +1 -1
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +10 -10
- package/dist/astro/routes/api/setup/admin-verify.mjs +10 -10
- package/dist/astro/routes/api/setup/admin.mjs +9 -9
- package/dist/astro/routes/api/setup/dev-bypass.mjs +22 -22
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +22 -22
- package/dist/astro/routes/api/setup/status.mjs +4 -4
- package/dist/astro/routes/api/snapshot.mjs +5 -5
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +11 -10
- package/dist/astro/routes/api/taxonomies/index.mjs.map +1 -1
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- package/dist/astro/routes/api/typegen.mjs +5 -5
- package/dist/astro/routes/api/well-known/auth.mjs +1 -1
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +2 -2
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +2 -2
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +6 -6
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +8 -8
- package/dist/astro/routes/api/widget-areas/_name_.mjs +5 -5
- package/dist/astro/routes/api/widget-areas/index.mjs +8 -8
- package/dist/astro/routes/api/widget-components.mjs +3 -3
- package/dist/astro/routes/robots.txt.mjs +5 -5
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +4 -4
- package/dist/astro/routes/sitemap.xml.mjs +5 -5
- package/dist/astro/types.d.mts +13 -12
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{authorize-BlyCH-96.mjs → authorize-Bkwe8kuL.mjs} +2 -2
- package/dist/{authorize-BlyCH-96.mjs.map → authorize-Bkwe8kuL.mjs.map} +1 -1
- package/dist/byline-CTaWkMh5.mjs +404 -0
- package/dist/byline-CTaWkMh5.mjs.map +1 -0
- package/dist/bylines-BYHWU3T7.mjs +174 -0
- package/dist/bylines-BYHWU3T7.mjs.map +1 -0
- package/dist/{bylines-C6eYUWlZ.d.mts → bylines-DtDRNF1n.d.mts} +63 -18
- package/dist/bylines-DtDRNF1n.d.mts.map +1 -0
- package/dist/bylines-H0Xh5TMy.mjs +118 -0
- package/dist/bylines-H0Xh5TMy.mjs.map +1 -0
- package/dist/{cache-CXCpjWiL.mjs → cache-CNk1jIxp.mjs} +2 -2
- package/dist/{cache-CXCpjWiL.mjs.map → cache-CNk1jIxp.mjs.map} +1 -1
- package/dist/{challenge-store-CJ0OOHOr.mjs → challenge-store-Dng1SxKT.mjs} +1 -1
- package/dist/{challenge-store-CJ0OOHOr.mjs.map → challenge-store-Dng1SxKT.mjs.map} +1 -1
- package/dist/{chunks-DyGtu1Bv.mjs → chunks-BkfVdD-3.mjs} +2 -2
- package/dist/{chunks-DyGtu1Bv.mjs.map → chunks-BkfVdD-3.mjs.map} +1 -1
- package/dist/cli/index.mjs +21 -29
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{comment-Dd9MI82-.mjs → comment-_yzlBYPx.mjs} +2 -2
- package/dist/{comment-Dd9MI82-.mjs.map → comment-_yzlBYPx.mjs.map} +1 -1
- package/dist/{comments-koGI0FrK.mjs → comments-DxID-rsd.mjs} +3 -3
- package/dist/{comments-koGI0FrK.mjs.map → comments-DxID-rsd.mjs.map} +1 -1
- package/dist/{components-mZem7pbe.mjs → components-Dx3DM0gg.mjs} +1 -1
- package/dist/{components-mZem7pbe.mjs.map → components-Dx3DM0gg.mjs.map} +1 -1
- package/dist/config-CVssduLe.mjs.map +1 -1
- package/dist/{content-D6YG26WG.mjs → content-C0ooIs-f.mjs} +3 -3
- package/dist/{content-D6YG26WG.mjs.map → content-C0ooIs-f.mjs.map} +1 -1
- package/dist/{context-qF8d3IPR.mjs → context-sAnCaUIR.mjs} +10 -10
- package/dist/context-sAnCaUIR.mjs.map +1 -0
- package/dist/{cron-H8eJ46dv.mjs → cron-Bd3b3iuj.mjs} +1 -1
- package/dist/{cron-H8eJ46dv.mjs.map → cron-Bd3b3iuj.mjs.map} +1 -1
- package/dist/{dashboard-BmWSIUwY.mjs → dashboard-Cqw3ay2X.mjs} +4 -4
- package/dist/{dashboard-BmWSIUwY.mjs.map → dashboard-Cqw3ay2X.mjs.map} +1 -1
- 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/{default-Dbs22Gg4.mjs → default-BvTAYCzx.mjs} +1 -1
- package/dist/{default-Dbs22Gg4.mjs.map → default-BvTAYCzx.mjs.map} +1 -1
- package/dist/{device-flow-BqJRxa0Q.mjs → device-flow-B9oG8PwP.mjs} +4 -4
- package/dist/{device-flow-BqJRxa0Q.mjs.map → device-flow-B9oG8PwP.mjs.map} +1 -1
- package/dist/{email-console-Dmp5Q-P2.mjs → email-console-CubRll9q.mjs} +1 -1
- package/dist/email-console-CubRll9q.mjs.map +1 -0
- package/dist/{error-tSQWIl5U.mjs → error-CPh_8eLq.mjs} +16 -8
- package/dist/error-CPh_8eLq.mjs.map +1 -0
- package/dist/{escape-B8bdIryO.mjs → escape-Cg6kMELH.mjs} +1 -1
- package/dist/{escape-B8bdIryO.mjs.map → escape-Cg6kMELH.mjs.map} +1 -1
- package/dist/{fts-manager-B633C-kQ.mjs → fts-manager-Mnrtn-r2.mjs} +2 -2
- package/dist/{fts-manager-B633C-kQ.mjs.map → fts-manager-Mnrtn-r2.mjs.map} +1 -1
- package/dist/{import-CNfLOgDE.mjs → import-DG80rC_I.mjs} +3 -3
- package/dist/{import-CNfLOgDE.mjs.map → import-DG80rC_I.mjs.map} +1 -1
- package/dist/{index-UmOMt9T-.d.mts → index-Bv1Wf1zB.d.mts} +235 -18
- package/dist/index-Bv1Wf1zB.d.mts.map +1 -0
- package/dist/{index-D2gvztOP.d.mts → index-CC42STEm.d.mts} +3 -3
- package/dist/{index-D2gvztOP.d.mts.map → index-CC42STEm.d.mts.map} +1 -1
- package/dist/index.d.mts +17 -17
- package/dist/index.mjs +50 -49
- package/dist/{load-QzYRpVN3.mjs → load-DmXNVhst.mjs} +2 -2
- package/dist/{load-QzYRpVN3.mjs.map → load-DmXNVhst.mjs.map} +1 -1
- package/dist/{loader-Cs6-Bqe6.mjs → loader-Chm5h7Gr.mjs} +3 -3
- package/dist/loader-Chm5h7Gr.mjs.map +1 -0
- package/dist/{manifest-schema-HCtSh4Jq.mjs → manifest-schema-Czqf0TLu.mjs} +1 -1
- package/dist/{manifest-schema-HCtSh4Jq.mjs.map → manifest-schema-Czqf0TLu.mjs.map} +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/local-runtime.d.mts +11 -11
- package/dist/media/local-runtime.mjs +4 -4
- package/dist/{media-allowlist-B8EX01DH.mjs → media-allowlist-BNloC69x.mjs} +1 -1
- package/dist/{media-allowlist-B8EX01DH.mjs.map → media-allowlist-BNloC69x.mjs.map} +1 -1
- package/dist/{media-Dg7he9uK.mjs → media-oqRcNiQf.mjs} +2 -2
- package/dist/media-oqRcNiQf.mjs.map +1 -0
- package/dist/{menus-DOzIecHi.mjs → menus-Bjf5R1Qq.mjs} +2 -2
- package/dist/menus-Bjf5R1Qq.mjs.map +1 -0
- package/dist/{menus-X4Z-eBA1.mjs → menus-C75SSmRy.mjs} +30 -11
- package/dist/menus-C75SSmRy.mjs.map +1 -0
- package/dist/mime-KV5TqkMN.mjs.map +1 -1
- package/dist/{mode-DPRPvJYm.mjs → mode-CaaiebZI.mjs} +1 -1
- package/dist/{mode-DPRPvJYm.mjs.map → mode-CaaiebZI.mjs.map} +1 -1
- package/dist/{oauth-authorization-62GmpGIH.mjs → oauth-authorization-CTMeVfvj.mjs} +4 -4
- package/dist/{oauth-authorization-62GmpGIH.mjs.map → oauth-authorization-CTMeVfvj.mjs.map} +1 -1
- package/dist/{oauth-clients-D_B0_-Bz.mjs → oauth-clients-eJCbkVSG.mjs} +1 -1
- package/dist/oauth-clients-eJCbkVSG.mjs.map +1 -0
- package/dist/{oauth-state-store-DpsZViTu.mjs → oauth-state-store-vOSdOeGe.mjs} +1 -1
- package/dist/{oauth-state-store-DpsZViTu.mjs.map → oauth-state-store-vOSdOeGe.mjs.map} +1 -1
- package/dist/{oauth-user-lookup-meyS2oB1.mjs → oauth-user-lookup-3JwsVw6N.mjs} +1 -1
- package/dist/{oauth-user-lookup-meyS2oB1.mjs.map → oauth-user-lookup-3JwsVw6N.mjs.map} +1 -1
- package/dist/options-BL4X94qY.mjs.map +1 -1
- package/dist/{options-Cq64Wx0O.d.mts → options-DhV-gwJb.d.mts} +4 -4
- package/dist/options-DhV-gwJb.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{parse-BFTPon-J.mjs → parse-3-caTKgt.mjs} +2 -2
- package/dist/{parse-BFTPon-J.mjs.map → parse-3-caTKgt.mjs.map} +1 -1
- package/dist/{passkey-config-Cg86_ISa.mjs → passkey-config-BloQOT3y.mjs} +1 -1
- package/dist/{passkey-config-Cg86_ISa.mjs.map → passkey-config-BloQOT3y.mjs.map} +1 -1
- package/dist/{placeholder-D3cFCU9y.d.mts → placeholder-KCkkCtgQ.d.mts} +1 -1
- package/dist/{placeholder-D3cFCU9y.d.mts.map → placeholder-KCkkCtgQ.d.mts.map} +1 -1
- package/dist/plugin-types.d.mts +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +26 -15
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/{preview-C1LOEbWZ.mjs → preview-D4z0WONU.mjs} +2 -2
- package/dist/{preview-C1LOEbWZ.mjs.map → preview-D4z0WONU.mjs.map} +1 -1
- package/dist/{public-url-CseXl9Fv.mjs → public-url-CUWWFME2.mjs} +1 -1
- package/dist/{public-url-CseXl9Fv.mjs.map → public-url-CUWWFME2.mjs.map} +1 -1
- package/dist/{query-axZmO6Tn.mjs → query-BJn8TOPk.mjs} +16 -13
- package/dist/{query-axZmO6Tn.mjs.map → query-BJn8TOPk.mjs.map} +1 -1
- package/dist/{rate-limit-t5CVjCO6.mjs → rate-limit-D_-gAeJ0.mjs} +2 -2
- package/dist/{rate-limit-t5CVjCO6.mjs.map → rate-limit-D_-gAeJ0.mjs.map} +1 -1
- package/dist/{redirect-DGRsLO2I.mjs → redirect-BINiRYq4.mjs} +1 -1
- package/dist/{redirect-DGRsLO2I.mjs.map → redirect-BINiRYq4.mjs.map} +1 -1
- package/dist/{redirect-DkaDxq8e.mjs → redirect-CNv4mHX2.mjs} +2 -2
- package/dist/{redirect-DkaDxq8e.mjs.map → redirect-CNv4mHX2.mjs.map} +1 -1
- package/dist/{redirects-D1fdd68T.mjs → redirects-B-CUZ1Xh.mjs} +3 -3
- package/dist/{redirects-D1fdd68T.mjs.map → redirects-B-CUZ1Xh.mjs.map} +1 -1
- package/dist/{redirects-Dmj6KRU3.mjs → redirects-COMLwsV5.mjs} +19 -5
- package/dist/redirects-COMLwsV5.mjs.map +1 -0
- package/dist/{registry-BnCeHYsf.mjs → registry-DqrAQDXH.mjs} +4 -4
- package/dist/{registry-BnCeHYsf.mjs.map → registry-DqrAQDXH.mjs.map} +1 -1
- package/dist/request-cache-dzCt8TZB.mjs.map +1 -1
- package/dist/request-context.mjs.map +1 -1
- package/dist/{request-meta-CLCwSQOS.mjs → request-meta-C_Cjii-T.mjs} +2 -2
- package/dist/{request-meta-CLCwSQOS.mjs.map → request-meta-C_Cjii-T.mjs.map} +1 -1
- package/dist/resolve-Cj98DuqN.mjs +39 -0
- package/dist/resolve-Cj98DuqN.mjs.map +1 -0
- package/dist/{runner-DdnQIwz_.mjs → runner-CGlojznK.mjs} +472 -165
- package/dist/runner-CGlojznK.mjs.map +1 -0
- package/dist/{runner-DcfZewkO.d.mts → runner-CNHRo1mT.d.mts} +2 -2
- package/dist/{runner-DcfZewkO.d.mts.map → runner-CNHRo1mT.d.mts.map} +1 -1
- package/dist/runtime.d.mts +10 -10
- package/dist/runtime.mjs +2 -2
- package/dist/{schema-BmqagCwG.mjs → schema-Djdlfi5G.mjs} +4 -4
- package/dist/{schema-BmqagCwG.mjs.map → schema-Djdlfi5G.mjs.map} +1 -1
- package/dist/{search-CPrvO5u8.mjs → search-By-NN3da.mjs} +4 -4
- package/dist/{search-CPrvO5u8.mjs.map → search-By-NN3da.mjs.map} +1 -1
- package/dist/{secrets-6pgZyq0K.mjs → secrets-rPdhEBkD.mjs} +1 -1
- package/dist/{secrets-6pgZyq0K.mjs.map → secrets-rPdhEBkD.mjs.map} +1 -1
- package/dist/{sections-Cm-zb-gZ.mjs → sections-DcBIlOq1.mjs} +3 -3
- package/dist/{sections-Cm-zb-gZ.mjs.map → sections-DcBIlOq1.mjs.map} +1 -1
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +16 -16
- package/dist/seo/index.d.mts +1 -1
- package/dist/{seo-DRq9-EPP.mjs → seo-bjDoq9Eg.mjs} +2 -2
- package/dist/{seo-DRq9-EPP.mjs.map → seo-bjDoq9Eg.mjs.map} +1 -1
- package/dist/{service-vByySp-2.mjs → service-BuuTdGAT.mjs} +3 -3
- package/dist/{service-vByySp-2.mjs.map → service-BuuTdGAT.mjs.map} +1 -1
- package/dist/{settings-CBBj7HUd.mjs → settings-CJnKiWuR.mjs} +3 -3
- package/dist/{settings-CBBj7HUd.mjs.map → settings-CJnKiWuR.mjs.map} +1 -1
- package/dist/{settings-xQKsWnzQ.mjs → settings-hcubRfkr.mjs} +3 -3
- package/dist/settings-hcubRfkr.mjs.map +1 -0
- package/dist/{setup-BGAJ2uXs.mjs → setup-Cf_TyOv5.mjs} +2 -2
- package/dist/{setup-BGAJ2uXs.mjs.map → setup-Cf_TyOv5.mjs.map} +1 -1
- package/dist/{setup-complete-C6ZCLhKo.mjs → setup-complete-MzzN9u0b.mjs} +1 -1
- package/dist/{setup-complete-C6ZCLhKo.mjs.map → setup-complete-MzzN9u0b.mjs.map} +1 -1
- package/dist/{setup-nonce-CY1gQiAU.mjs → setup-nonce-DXuriHsg.mjs} +1 -1
- package/dist/{setup-nonce-CY1gQiAU.mjs.map → setup-nonce-DXuriHsg.mjs.map} +1 -1
- package/dist/{site-url-D-M4Fd8O.mjs → site-url-xkhw1tcz.mjs} +1 -1
- package/dist/{site-url-D-M4Fd8O.mjs.map → site-url-xkhw1tcz.mjs.map} +1 -1
- package/dist/{ssrf-DzFN_qV-.mjs → ssrf-MZ-zrG6-.mjs} +1 -1
- package/dist/{ssrf-DzFN_qV-.mjs.map → ssrf-MZ-zrG6-.mjs.map} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/local.mjs.map +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage/s3.mjs.map +1 -1
- package/dist/{taxonomies-Dc0mzlms.mjs → taxonomies-CLs9HPE2.mjs} +4 -4
- package/dist/{taxonomies-Dc0mzlms.mjs.map → taxonomies-CLs9HPE2.mjs.map} +1 -1
- package/dist/{taxonomies-Cn9UpaR2.mjs → taxonomies-WamPVA2x.mjs} +7 -42
- package/dist/taxonomies-WamPVA2x.mjs.map +1 -0
- package/dist/{taxonomy-wPfusMK9.mjs → taxonomy-D4Uc2LsZ.mjs} +3 -3
- package/dist/{taxonomy-wPfusMK9.mjs.map → taxonomy-D4Uc2LsZ.mjs.map} +1 -1
- package/dist/{tokens-DILYNZMi.mjs → tokens-N8otWMmj.mjs} +1 -1
- package/dist/{tokens-DILYNZMi.mjs.map → tokens-N8otWMmj.mjs.map} +1 -1
- package/dist/{transport-fw-mKJzT.mjs → transport-B6CHddbu.mjs} +1 -1
- package/dist/{transport-fw-mKJzT.mjs.map → transport-B6CHddbu.mjs.map} +1 -1
- package/dist/{transport-GeXlLscf.d.mts → transport-DOxLfUir.d.mts} +1 -1
- package/dist/{transport-GeXlLscf.d.mts.map → transport-DOxLfUir.d.mts.map} +1 -1
- package/dist/{trusted-proxy-CJhQIk65.mjs → trusted-proxy-97pajC2f.mjs} +1 -1
- package/dist/{trusted-proxy-CJhQIk65.mjs.map → trusted-proxy-97pajC2f.mjs.map} +1 -1
- package/dist/{types-CwXMEPRr.mjs → types-ByV5sgsv.mjs} +2 -2
- package/dist/types-ByV5sgsv.mjs.map +1 -0
- package/dist/{types-Dz9CGX_d.mjs → types-Cd9UCu3t.mjs} +1 -1
- package/dist/{types-Dz9CGX_d.mjs.map → types-Cd9UCu3t.mjs.map} +1 -1
- package/dist/{types-DmxPPXGf.d.mts → types-CkDSF81F.d.mts} +1 -1
- package/dist/{types-DmxPPXGf.d.mts.map → types-CkDSF81F.d.mts.map} +1 -1
- package/dist/{types-BWhaSS7U.d.mts → types-CpUuGcd5.d.mts} +1 -1
- package/dist/{types-BWhaSS7U.d.mts.map → types-CpUuGcd5.d.mts.map} +1 -1
- package/dist/{types-DFowNO60.d.mts → types-D599-ruj.d.mts} +1 -1
- package/dist/{types-DFowNO60.d.mts.map → types-D599-ruj.d.mts.map} +1 -1
- package/dist/{types-B05e2naf.d.mts → types-DGHWRQgr.d.mts} +3 -3
- package/dist/{types-B05e2naf.d.mts.map → types-DGHWRQgr.d.mts.map} +1 -1
- package/dist/{types-CzvJd1ND.d.mts → types-DaYDYW6g.d.mts} +14 -1
- package/dist/types-DaYDYW6g.d.mts.map +1 -0
- package/dist/{types-C1KKK4VP.d.mts → types-DaqNzqVt.d.mts} +16 -1
- package/dist/{types-C1KKK4VP.d.mts.map → types-DaqNzqVt.d.mts.map} +1 -1
- package/dist/{types-DW1l0gCv.d.mts → types-Dgo6y-Ut.d.mts} +1 -1
- package/dist/{types-DW1l0gCv.d.mts.map → types-Dgo6y-Ut.d.mts.map} +1 -1
- package/dist/{types-Cb2UCDJg.d.mts → types-bYmRn_Uy.d.mts} +1 -1
- package/dist/{types-Cb2UCDJg.d.mts.map → types-bYmRn_Uy.d.mts.map} +1 -1
- package/dist/{user-Dr1bOCqS.mjs → user-D3BD5zdT.mjs} +2 -2
- package/dist/{user-Dr1bOCqS.mjs.map → user-D3BD5zdT.mjs.map} +1 -1
- package/dist/{utils-_F-rWBTN.mjs → utils-C3wTAP-P.mjs} +1 -1
- package/dist/{utils-_F-rWBTN.mjs.map → utils-C3wTAP-P.mjs.map} +1 -1
- package/dist/{validate-BpQGsmd7.d.mts → validate-DQtHw9NT.d.mts} +5 -5
- package/dist/{validate-BpQGsmd7.d.mts.map → validate-DQtHw9NT.d.mts.map} +1 -1
- package/dist/{validate-DlFxcVVK.mjs → validate-mz87i8_1.mjs} +2 -2
- package/dist/{validate-DlFxcVVK.mjs.map → validate-mz87i8_1.mjs.map} +1 -1
- package/dist/{validation-BiFJqUp5.mjs → validation-DKHhXjPr.mjs} +5 -5
- package/dist/{validation-BiFJqUp5.mjs.map → validation-DKHhXjPr.mjs.map} +1 -1
- package/dist/version-Ct7C6RSo.mjs +7 -0
- package/dist/{version-Dw7Z5PVU.mjs.map → version-Ct7C6RSo.mjs.map} +1 -1
- package/dist/{widgets-B9j_yzlk.mjs → widgets-lShIQXU5.mjs} +3 -3
- package/dist/widgets-lShIQXU5.mjs.map +1 -0
- package/dist/{zod-generator-DSyz01KE.mjs → zod-generator-dvxgmd1M.mjs} +2 -2
- package/dist/{zod-generator-DSyz01KE.mjs.map → zod-generator-dvxgmd1M.mjs.map} +1 -1
- package/package.json +10 -8
- package/src/api/error.ts +18 -3
- package/src/api/errors.ts +6 -0
- package/src/api/handlers/bylines.ts +161 -0
- package/src/api/handlers/content.ts +125 -43
- package/src/api/handlers/index.ts +6 -0
- package/src/api/handlers/marketplace.ts +27 -5
- package/src/api/handlers/oauth-clients.ts +1 -1
- package/src/api/handlers/registry.ts +568 -22
- package/src/api/openapi/document.ts +1 -1
- package/src/api/schemas/bylines.ts +46 -0
- package/src/astro/integration/index.ts +1 -1
- package/src/astro/integration/routes.ts +5 -0
- package/src/astro/integration/runtime.ts +12 -1
- package/src/astro/integration/virtual-modules.ts +19 -2
- package/src/astro/integration/vite-config.ts +2 -2
- package/src/astro/middleware/auth.ts +7 -7
- package/src/astro/middleware/request-context.ts +1 -1
- package/src/astro/middleware.ts +31 -20
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +3 -12
- package/src/astro/routes/api/admin/bylines/[id]/translations.ts +99 -0
- package/src/astro/routes/api/admin/bylines/index.ts +22 -11
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +1 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +6 -1
- package/src/astro/routes/api/admin/plugins/registry/[id]/uninstall.ts +51 -0
- package/src/astro/routes/api/admin/plugins/registry/[id]/update.ts +79 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +43 -6
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +1 -1
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +2 -2
- package/src/astro/routes/api/auth/oauth/[provider].ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +6 -6
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +1 -1
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id].ts +6 -6
- package/src/astro/routes/api/import/wordpress/execute.ts +1 -1
- package/src/astro/routes/api/import/wordpress/prepare.ts +2 -2
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +3 -3
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +2 -2
- package/src/astro/routes/api/media/upload-url.ts +1 -1
- package/src/astro/routes/api/redirects/404s/index.ts +3 -3
- package/src/astro/routes/api/redirects/404s/summary.ts +1 -1
- package/src/astro/routes/api/redirects/[id].ts +3 -3
- package/src/astro/routes/api/redirects/index.ts +2 -2
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +2 -6
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +1 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +6 -6
- package/src/astro/routes/api/schema/collections/index.ts +4 -4
- package/src/astro/routes/api/schema/index.ts +1 -1
- package/src/astro/routes/api/schema/orphans/[slug].ts +1 -1
- package/src/astro/routes/api/schema/orphans/index.ts +1 -1
- package/src/astro/routes/api/sections/[slug].ts +3 -3
- package/src/astro/routes/api/sections/index.ts +2 -2
- package/src/astro/types.ts +4 -0
- package/src/auth/rate-limit.ts +1 -1
- package/src/auth/trusted-proxy.ts +1 -1
- package/src/bylines/index.ts +154 -55
- package/src/cli/commands/init.ts +4 -8
- package/src/client/index.ts +1 -1
- package/src/components/InlinePortableTextEditor.tsx +5 -1
- package/src/components/inline-code-block.tsx +343 -0
- package/src/config/secrets.ts +3 -3
- package/src/database/migrations/006_taxonomy_defs.ts +1 -1
- package/src/database/migrations/014_draft_revisions.ts +6 -6
- package/src/database/migrations/040_byline_i18n.ts +497 -0
- package/src/database/migrations/runner.ts +4 -1
- package/src/database/repositories/audit.ts +2 -2
- package/src/database/repositories/byline.ts +320 -50
- package/src/database/repositories/media.ts +2 -2
- package/src/database/repositories/menu.ts +1 -1
- package/src/database/repositories/options.ts +3 -3
- package/src/database/repositories/plugin-storage.ts +3 -3
- package/src/database/repositories/types.ts +13 -0
- package/src/database/types.ts +15 -0
- package/src/emdash-runtime.ts +492 -20
- package/src/i18n/config.ts +1 -1
- package/src/index.ts +7 -0
- package/src/loader.ts +1 -1
- package/src/mcp/server.ts +3 -3
- package/src/media/mime.ts +1 -1
- package/src/page/absolute-url.ts +1 -1
- package/src/plugins/adapt-sandbox-entry.ts +45 -40
- package/src/plugins/email-console.ts +1 -1
- package/src/plugins/index.ts +1 -0
- package/src/plugins/marketplace.ts +1 -1
- package/src/plugins/sandbox/index.ts +1 -0
- package/src/plugins/sandbox/noop.ts +11 -3
- package/src/plugins/sandbox/types.ts +28 -0
- package/src/query.ts +17 -2
- package/src/registry/config.ts +1 -1
- package/src/request-cache.ts +3 -3
- package/src/request-context.ts +1 -1
- package/src/settings/index.ts +4 -4
- package/src/storage/local.ts +1 -1
- package/src/storage/s3.ts +3 -3
- package/src/widgets/index.ts +1 -1
- package/dist/api-ayIQ7rIe.mjs.map +0 -1
- package/dist/byline-D09BaS4j.mjs +0 -220
- package/dist/byline-D09BaS4j.mjs.map +0 -1
- package/dist/bylines-BTM2xtP8.mjs +0 -113
- package/dist/bylines-BTM2xtP8.mjs.map +0 -1
- package/dist/bylines-C6eYUWlZ.d.mts.map +0 -1
- package/dist/context-qF8d3IPR.mjs.map +0 -1
- package/dist/email-console-Dmp5Q-P2.mjs.map +0 -1
- package/dist/error-tSQWIl5U.mjs.map +0 -1
- package/dist/index-UmOMt9T-.d.mts.map +0 -1
- package/dist/loader-Cs6-Bqe6.mjs.map +0 -1
- package/dist/media-Dg7he9uK.mjs.map +0 -1
- package/dist/menus-DOzIecHi.mjs.map +0 -1
- package/dist/menus-X4Z-eBA1.mjs.map +0 -1
- package/dist/oauth-clients-D_B0_-Bz.mjs.map +0 -1
- package/dist/options-Cq64Wx0O.d.mts.map +0 -1
- package/dist/redirects-Dmj6KRU3.mjs.map +0 -1
- package/dist/runner-DdnQIwz_.mjs.map +0 -1
- package/dist/settings-xQKsWnzQ.mjs.map +0 -1
- package/dist/taxonomies-Cn9UpaR2.mjs.map +0 -1
- package/dist/types-CwXMEPRr.mjs.map +0 -1
- package/dist/types-CzvJd1ND.d.mts.map +0 -1
- package/dist/version-Dw7Z5PVU.mjs +0 -7
- package/dist/widgets-B9j_yzlk.mjs.map +0 -1
- /package/dist/{api-tokens-D3C9v02m.mjs → api-tokens-iPIHAY8N.mjs} +0 -0
- /package/dist/{ssrf-CTul4uQi.mjs → ssrf-BIcd-aXW.mjs} +0 -0
- /package/dist/{types-Db67HHlU.mjs → types-1NNkmTIn.mjs} +0 -0
|
@@ -2,7 +2,8 @@ import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
|
|
|
2
2
|
import { c as listTablesLike, i as currentTimestampValue, n as columnExists, o as isSqlite, r as currentTimestamp, t as binaryType } from "./dialect-helpers-BKCvISIQ.mjs";
|
|
3
3
|
import { n as getI18nConfig } from "./config-CVssduLe.mjs";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
|
-
import {
|
|
5
|
+
import { sql } from "kysely";
|
|
6
|
+
import { Migrator } from "kysely/migration";
|
|
6
7
|
|
|
7
8
|
//#region \0rolldown/runtime.js
|
|
8
9
|
var __defProp = Object.defineProperty;
|
|
@@ -23,8 +24,8 @@ var __exportAll = (all, no_symbols) => {
|
|
|
23
24
|
//#endregion
|
|
24
25
|
//#region src/database/migrations/001_initial.ts
|
|
25
26
|
var _001_initial_exports = /* @__PURE__ */ __exportAll({
|
|
26
|
-
down: () => down$
|
|
27
|
-
up: () => up$
|
|
27
|
+
down: () => down$38,
|
|
28
|
+
up: () => up$38
|
|
28
29
|
});
|
|
29
30
|
/**
|
|
30
31
|
* Initial schema migration
|
|
@@ -33,7 +34,7 @@ var _001_initial_exports = /* @__PURE__ */ __exportAll({
|
|
|
33
34
|
* by the SchemaRegistry when collections are added via the admin UI.
|
|
34
35
|
* This migration only creates system tables.
|
|
35
36
|
*/
|
|
36
|
-
async function up$
|
|
37
|
+
async function up$38(db) {
|
|
37
38
|
await db.schema.createTable("revisions").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection", "text", (col) => col.notNull()).addColumn("entry_id", "text", (col) => col.notNull()).addColumn("data", "text", (col) => col.notNull()).addColumn("author_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
38
39
|
await db.schema.createIndex("idx_revisions_entry").ifNotExists().on("revisions").columns(["collection", "entry_id"]).execute();
|
|
39
40
|
await db.schema.createTable("taxonomies").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("slug", "text", (col) => col.notNull()).addColumn("label", "text", (col) => col.notNull()).addColumn("parent_id", "text").addColumn("data", "text").addUniqueConstraint("taxonomies_name_slug_unique", ["name", "slug"]).addForeignKeyConstraint("taxonomies_parent_fk", ["parent_id"], "taxonomies", ["id"], (cb) => cb.onDelete("set null")).execute();
|
|
@@ -53,7 +54,7 @@ async function up$37(db) {
|
|
|
53
54
|
await db.schema.createIndex("idx_audit_action").ifNotExists().on("audit_logs").column("action").execute();
|
|
54
55
|
await db.schema.createIndex("idx_audit_timestamp").ifNotExists().on("audit_logs").column("timestamp").execute();
|
|
55
56
|
}
|
|
56
|
-
async function down$
|
|
57
|
+
async function down$38(db) {
|
|
57
58
|
await db.schema.dropTable("audit_logs").execute();
|
|
58
59
|
await db.schema.dropTable("options").execute();
|
|
59
60
|
await db.schema.dropTable("users").execute();
|
|
@@ -66,26 +67,26 @@ async function down$37(db) {
|
|
|
66
67
|
//#endregion
|
|
67
68
|
//#region src/database/migrations/002_media_status.ts
|
|
68
69
|
var _002_media_status_exports = /* @__PURE__ */ __exportAll({
|
|
69
|
-
down: () => down$
|
|
70
|
-
up: () => up$
|
|
70
|
+
down: () => down$37,
|
|
71
|
+
up: () => up$37
|
|
71
72
|
});
|
|
72
73
|
/**
|
|
73
74
|
* Add status column to media table for tracking upload state.
|
|
74
75
|
* Status values: 'pending' | 'ready' | 'failed'
|
|
75
76
|
*/
|
|
76
|
-
async function up$
|
|
77
|
+
async function up$37(db) {
|
|
77
78
|
await db.schema.alterTable("media").addColumn("status", "text", (col) => col.notNull().defaultTo("ready")).execute();
|
|
78
79
|
await db.schema.createIndex("idx_media_status").on("media").column("status").execute();
|
|
79
80
|
}
|
|
80
|
-
async function down$
|
|
81
|
+
async function down$37(db) {
|
|
81
82
|
await db.schema.dropIndex("idx_media_status").execute();
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
//#endregion
|
|
85
86
|
//#region src/database/migrations/003_schema_registry.ts
|
|
86
87
|
var _003_schema_registry_exports = /* @__PURE__ */ __exportAll({
|
|
87
|
-
down: () => down$
|
|
88
|
-
up: () => up$
|
|
88
|
+
down: () => down$36,
|
|
89
|
+
up: () => up$36
|
|
89
90
|
});
|
|
90
91
|
/**
|
|
91
92
|
* Migration: Schema Registry Tables
|
|
@@ -93,14 +94,14 @@ var _003_schema_registry_exports = /* @__PURE__ */ __exportAll({
|
|
|
93
94
|
* Creates the schema registry tables that store collection and field definitions.
|
|
94
95
|
* This enables dynamic schema management where D1 is the source of truth.
|
|
95
96
|
*/
|
|
96
|
-
async function up$
|
|
97
|
+
async function up$36(db) {
|
|
97
98
|
await db.schema.createTable("_emdash_collections").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("label_singular", "text").addColumn("description", "text").addColumn("icon", "text").addColumn("supports", "text").addColumn("source", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
98
99
|
await db.schema.createTable("_emdash_fields").addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection_id", "text", (col) => col.notNull()).addColumn("slug", "text", (col) => col.notNull()).addColumn("label", "text", (col) => col.notNull()).addColumn("type", "text", (col) => col.notNull()).addColumn("column_type", "text", (col) => col.notNull()).addColumn("required", "integer", (col) => col.defaultTo(0)).addColumn("unique", "integer", (col) => col.defaultTo(0)).addColumn("default_value", "text").addColumn("validation", "text").addColumn("widget", "text").addColumn("options", "text").addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("fields_collection_fk", ["collection_id"], "_emdash_collections", ["id"], (cb) => cb.onDelete("cascade")).execute();
|
|
99
100
|
await db.schema.createIndex("idx_fields_collection_slug").on("_emdash_fields").columns(["collection_id", "slug"]).unique().execute();
|
|
100
101
|
await db.schema.createIndex("idx_fields_collection").on("_emdash_fields").column("collection_id").execute();
|
|
101
102
|
await db.schema.createIndex("idx_fields_sort").on("_emdash_fields").columns(["collection_id", "sort_order"]).execute();
|
|
102
103
|
}
|
|
103
|
-
async function down$
|
|
104
|
+
async function down$36(db) {
|
|
104
105
|
await db.schema.dropTable("_emdash_fields").execute();
|
|
105
106
|
await db.schema.dropTable("_emdash_collections").execute();
|
|
106
107
|
}
|
|
@@ -108,8 +109,8 @@ async function down$35(db) {
|
|
|
108
109
|
//#endregion
|
|
109
110
|
//#region src/database/migrations/004_plugins.ts
|
|
110
111
|
var _004_plugins_exports = /* @__PURE__ */ __exportAll({
|
|
111
|
-
down: () => down$
|
|
112
|
-
up: () => up$
|
|
112
|
+
down: () => down$35,
|
|
113
|
+
up: () => up$35
|
|
113
114
|
});
|
|
114
115
|
/**
|
|
115
116
|
* Migration: Plugin System Tables
|
|
@@ -119,7 +120,7 @@ var _004_plugins_exports = /* @__PURE__ */ __exportAll({
|
|
|
119
120
|
*
|
|
120
121
|
* @see PLUGIN-SYSTEM.md § Plugin Storage
|
|
121
122
|
*/
|
|
122
|
-
async function up$
|
|
123
|
+
async function up$35(db) {
|
|
123
124
|
await db.schema.createTable("_plugin_storage").addColumn("plugin_id", "text", (col) => col.notNull()).addColumn("collection", "text", (col) => col.notNull()).addColumn("id", "text", (col) => col.notNull()).addColumn("data", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("pk_plugin_storage", [
|
|
124
125
|
"plugin_id",
|
|
125
126
|
"collection",
|
|
@@ -137,7 +138,7 @@ async function up$34(db) {
|
|
|
137
138
|
"index_name"
|
|
138
139
|
]).execute();
|
|
139
140
|
}
|
|
140
|
-
async function down$
|
|
141
|
+
async function down$35(db) {
|
|
141
142
|
await db.schema.dropTable("_plugin_indexes").execute();
|
|
142
143
|
await db.schema.dropTable("_plugin_state").execute();
|
|
143
144
|
await db.schema.dropTable("_plugin_storage").execute();
|
|
@@ -146,8 +147,8 @@ async function down$34(db) {
|
|
|
146
147
|
//#endregion
|
|
147
148
|
//#region src/database/migrations/005_menus.ts
|
|
148
149
|
var _005_menus_exports = /* @__PURE__ */ __exportAll({
|
|
149
|
-
down: () => down$
|
|
150
|
-
up: () => up$
|
|
150
|
+
down: () => down$34,
|
|
151
|
+
up: () => up$34
|
|
151
152
|
});
|
|
152
153
|
/**
|
|
153
154
|
* Navigation Menus migration
|
|
@@ -155,13 +156,13 @@ var _005_menus_exports = /* @__PURE__ */ __exportAll({
|
|
|
155
156
|
* Creates tables for admin-editable navigation menus.
|
|
156
157
|
* Menu items can reference content entries, taxonomy terms, or custom URLs.
|
|
157
158
|
*/
|
|
158
|
-
async function up$
|
|
159
|
+
async function up$34(db) {
|
|
159
160
|
await db.schema.createTable("_emdash_menus").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
160
161
|
await db.schema.createTable("_emdash_menu_items").addColumn("id", "text", (col) => col.primaryKey()).addColumn("menu_id", "text", (col) => col.notNull()).addColumn("parent_id", "text").addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("type", "text", (col) => col.notNull()).addColumn("reference_collection", "text").addColumn("reference_id", "text").addColumn("custom_url", "text").addColumn("label", "text", (col) => col.notNull()).addColumn("title_attr", "text").addColumn("target", "text").addColumn("css_classes", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("menu_items_menu_fk", ["menu_id"], "_emdash_menus", ["id"], (cb) => cb.onDelete("cascade")).addForeignKeyConstraint("menu_items_parent_fk", ["parent_id"], "_emdash_menu_items", ["id"], (cb) => cb.onDelete("cascade")).execute();
|
|
161
162
|
await db.schema.createIndex("idx_menu_items_menu").on("_emdash_menu_items").columns(["menu_id", "sort_order"]).execute();
|
|
162
163
|
await db.schema.createIndex("idx_menu_items_parent").on("_emdash_menu_items").column("parent_id").execute();
|
|
163
164
|
}
|
|
164
|
-
async function down$
|
|
165
|
+
async function down$34(db) {
|
|
165
166
|
await db.schema.dropTable("_emdash_menu_items").execute();
|
|
166
167
|
await db.schema.dropTable("_emdash_menus").execute();
|
|
167
168
|
}
|
|
@@ -169,8 +170,8 @@ async function down$33(db) {
|
|
|
169
170
|
//#endregion
|
|
170
171
|
//#region src/database/migrations/006_taxonomy_defs.ts
|
|
171
172
|
var _006_taxonomy_defs_exports = /* @__PURE__ */ __exportAll({
|
|
172
|
-
down: () => down$
|
|
173
|
-
up: () => up$
|
|
173
|
+
down: () => down$33,
|
|
174
|
+
up: () => up$33
|
|
174
175
|
});
|
|
175
176
|
/**
|
|
176
177
|
* Taxonomy definitions migration
|
|
@@ -178,7 +179,7 @@ var _006_taxonomy_defs_exports = /* @__PURE__ */ __exportAll({
|
|
|
178
179
|
* Adds _emdash_taxonomy_defs table to store taxonomy definitions (category, tag, custom)
|
|
179
180
|
* and seeds default category and tag taxonomies.
|
|
180
181
|
*/
|
|
181
|
-
async function up$
|
|
182
|
+
async function up$33(db) {
|
|
182
183
|
await db.schema.createTable("_emdash_taxonomy_defs").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("label_singular", "text").addColumn("hierarchical", "integer", (col) => col.defaultTo(0)).addColumn("collections", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
183
184
|
await db.insertInto("_emdash_taxonomy_defs").values([{
|
|
184
185
|
id: "taxdef_category",
|
|
@@ -196,22 +197,22 @@ async function up$32(db) {
|
|
|
196
197
|
collections: JSON.stringify(["posts"])
|
|
197
198
|
}]).execute();
|
|
198
199
|
}
|
|
199
|
-
async function down$
|
|
200
|
+
async function down$33(db) {
|
|
200
201
|
await db.schema.dropTable("_emdash_taxonomy_defs").execute();
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
//#endregion
|
|
204
205
|
//#region src/database/migrations/007_widgets.ts
|
|
205
206
|
var _007_widgets_exports = /* @__PURE__ */ __exportAll({
|
|
206
|
-
down: () => down$
|
|
207
|
-
up: () => up$
|
|
207
|
+
down: () => down$32,
|
|
208
|
+
up: () => up$32
|
|
208
209
|
});
|
|
209
|
-
async function up$
|
|
210
|
+
async function up$32(db) {
|
|
210
211
|
await db.schema.createTable("_emdash_widget_areas").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("description", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
211
212
|
await db.schema.createTable("_emdash_widgets").addColumn("id", "text", (col) => col.primaryKey()).addColumn("area_id", "text", (col) => col.notNull().references("_emdash_widget_areas.id").onDelete("cascade")).addColumn("sort_order", "integer", (col) => col.notNull().defaultTo(0)).addColumn("type", "text", (col) => col.notNull()).addColumn("title", "text").addColumn("content", "text").addColumn("menu_name", "text").addColumn("component_id", "text").addColumn("component_props", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
212
213
|
await db.schema.createIndex("idx_widgets_area").on("_emdash_widgets").columns(["area_id", "sort_order"]).execute();
|
|
213
214
|
}
|
|
214
|
-
async function down$
|
|
215
|
+
async function down$32(db) {
|
|
215
216
|
await db.schema.dropTable("_emdash_widgets").execute();
|
|
216
217
|
await db.schema.dropTable("_emdash_widget_areas").execute();
|
|
217
218
|
}
|
|
@@ -219,8 +220,8 @@ async function down$31(db) {
|
|
|
219
220
|
//#endregion
|
|
220
221
|
//#region src/database/migrations/008_auth.ts
|
|
221
222
|
var _008_auth_exports = /* @__PURE__ */ __exportAll({
|
|
222
|
-
down: () => down$
|
|
223
|
-
up: () => up$
|
|
223
|
+
down: () => down$31,
|
|
224
|
+
up: () => up$31
|
|
224
225
|
});
|
|
225
226
|
/**
|
|
226
227
|
* Auth migration - passkey-first authentication
|
|
@@ -234,7 +235,7 @@ var _008_auth_exports = /* @__PURE__ */ __exportAll({
|
|
|
234
235
|
* - Creates oauth_accounts table (external provider links)
|
|
235
236
|
* - Creates allowed_domains table (self-signup)
|
|
236
237
|
*/
|
|
237
|
-
async function up$
|
|
238
|
+
async function up$31(db) {
|
|
238
239
|
await db.schema.createTable("users_new").addColumn("id", "text", (col) => col.primaryKey()).addColumn("email", "text", (col) => col.notNull().unique()).addColumn("name", "text").addColumn("avatar_url", "text").addColumn("role", "integer", (col) => col.notNull().defaultTo(10)).addColumn("email_verified", "integer", (col) => col.notNull().defaultTo(0)).addColumn("data", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
239
240
|
await sql`
|
|
240
241
|
INSERT INTO users_new (id, email, name, role, data, created_at, updated_at)
|
|
@@ -267,7 +268,7 @@ async function up$30(db) {
|
|
|
267
268
|
await db.schema.createTable("auth_challenges").addColumn("challenge", "text", (col) => col.primaryKey()).addColumn("type", "text", (col) => col.notNull()).addColumn("user_id", "text").addColumn("data", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
268
269
|
await db.schema.createIndex("idx_auth_challenges_expires").on("auth_challenges").column("expires_at").execute();
|
|
269
270
|
}
|
|
270
|
-
async function down$
|
|
271
|
+
async function down$31(db) {
|
|
271
272
|
await db.schema.dropTable("auth_challenges").execute();
|
|
272
273
|
await db.schema.dropTable("allowed_domains").execute();
|
|
273
274
|
await db.schema.dropTable("oauth_accounts").execute();
|
|
@@ -300,8 +301,8 @@ async function down$30(db) {
|
|
|
300
301
|
//#endregion
|
|
301
302
|
//#region src/database/migrations/009_user_disabled.ts
|
|
302
303
|
var _009_user_disabled_exports = /* @__PURE__ */ __exportAll({
|
|
303
|
-
down: () => down$
|
|
304
|
-
up: () => up$
|
|
304
|
+
down: () => down$30,
|
|
305
|
+
up: () => up$30
|
|
305
306
|
});
|
|
306
307
|
/**
|
|
307
308
|
* User disabled column - for soft-disabling users
|
|
@@ -310,19 +311,19 @@ var _009_user_disabled_exports = /* @__PURE__ */ __exportAll({
|
|
|
310
311
|
* - Adds disabled column to users table (INTEGER, default 0)
|
|
311
312
|
* - Disabled users cannot log in
|
|
312
313
|
*/
|
|
313
|
-
async function up$
|
|
314
|
+
async function up$30(db) {
|
|
314
315
|
await sql`ALTER TABLE users ADD COLUMN disabled INTEGER NOT NULL DEFAULT 0`.execute(db);
|
|
315
316
|
await db.schema.createIndex("idx_users_disabled").on("users").column("disabled").execute();
|
|
316
317
|
}
|
|
317
|
-
async function down$
|
|
318
|
+
async function down$30(db) {
|
|
318
319
|
await db.schema.dropIndex("idx_users_disabled").execute();
|
|
319
320
|
}
|
|
320
321
|
|
|
321
322
|
//#endregion
|
|
322
323
|
//#region src/database/migrations/011_sections.ts
|
|
323
324
|
var _011_sections_exports = /* @__PURE__ */ __exportAll({
|
|
324
|
-
down: () => down$
|
|
325
|
-
up: () => up$
|
|
325
|
+
down: () => down$29,
|
|
326
|
+
up: () => up$29
|
|
326
327
|
});
|
|
327
328
|
/**
|
|
328
329
|
* Migration: Add sections tables and performance indexes
|
|
@@ -331,13 +332,13 @@ var _011_sections_exports = /* @__PURE__ */ __exportAll({
|
|
|
331
332
|
* They provide a library of pre-built page sections (heroes, CTAs, testimonials, etc.)
|
|
332
333
|
* that content authors can browse and insert with a single click.
|
|
333
334
|
*/
|
|
334
|
-
async function up$
|
|
335
|
+
async function up$29(db) {
|
|
335
336
|
await db.schema.createTable("_emdash_section_categories").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
336
337
|
await db.schema.createTable("_emdash_sections").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("title", "text", (col) => col.notNull()).addColumn("description", "text").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).addColumn("keywords", "text").addColumn("content", "text", (col) => col.notNull()).addColumn("preview_media_id", "text").addColumn("source", "text", (col) => col.notNull().defaultTo("user")).addColumn("theme_id", "text").addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).addColumn("updated_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
337
338
|
await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
|
|
338
339
|
await db.schema.createIndex("idx_sections_source").on("_emdash_sections").columns(["source"]).execute();
|
|
339
340
|
}
|
|
340
|
-
async function down$
|
|
341
|
+
async function down$29(db) {
|
|
341
342
|
await db.schema.dropIndex("idx_sections_source").execute();
|
|
342
343
|
await db.schema.dropIndex("idx_sections_category").execute();
|
|
343
344
|
await db.schema.dropTable("_emdash_sections").execute();
|
|
@@ -347,8 +348,8 @@ async function down$28(db) {
|
|
|
347
348
|
//#endregion
|
|
348
349
|
//#region src/database/migrations/012_search.ts
|
|
349
350
|
var _012_search_exports = /* @__PURE__ */ __exportAll({
|
|
350
|
-
down: () => down$
|
|
351
|
-
up: () => up$
|
|
351
|
+
down: () => down$28,
|
|
352
|
+
up: () => up$28
|
|
352
353
|
});
|
|
353
354
|
/**
|
|
354
355
|
* Migration: Search Support
|
|
@@ -356,11 +357,11 @@ var _012_search_exports = /* @__PURE__ */ __exportAll({
|
|
|
356
357
|
* Adds search configuration to collections and searchable flag to fields.
|
|
357
358
|
* FTS5 tables are created dynamically when search is enabled for a collection.
|
|
358
359
|
*/
|
|
359
|
-
async function up$
|
|
360
|
+
async function up$28(db) {
|
|
360
361
|
await db.schema.alterTable("_emdash_collections").addColumn("search_config", "text").execute();
|
|
361
362
|
await db.schema.alterTable("_emdash_fields").addColumn("searchable", "integer", (col) => col.defaultTo(0)).execute();
|
|
362
363
|
}
|
|
363
|
-
async function down$
|
|
364
|
+
async function down$28(db) {
|
|
364
365
|
await db.schema.alterTable("_emdash_fields").dropColumn("searchable").execute();
|
|
365
366
|
await db.schema.alterTable("_emdash_collections").dropColumn("search_config").execute();
|
|
366
367
|
}
|
|
@@ -368,8 +369,8 @@ async function down$27(db) {
|
|
|
368
369
|
//#endregion
|
|
369
370
|
//#region src/database/migrations/013_scheduled_publishing.ts
|
|
370
371
|
var _013_scheduled_publishing_exports = /* @__PURE__ */ __exportAll({
|
|
371
|
-
down: () => down$
|
|
372
|
-
up: () => up$
|
|
372
|
+
down: () => down$27,
|
|
373
|
+
up: () => up$27
|
|
373
374
|
});
|
|
374
375
|
/**
|
|
375
376
|
* Migration: Add scheduled publishing support
|
|
@@ -378,7 +379,7 @@ var _013_scheduled_publishing_exports = /* @__PURE__ */ __exportAll({
|
|
|
378
379
|
* When scheduled_at is set and status is 'scheduled', the content
|
|
379
380
|
* will be auto-published when the scheduled time is reached.
|
|
380
381
|
*/
|
|
381
|
-
async function up$
|
|
382
|
+
async function up$27(db) {
|
|
382
383
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
383
384
|
for (const tableName of tableNames) {
|
|
384
385
|
const table = { name: tableName };
|
|
@@ -393,7 +394,7 @@ async function up$26(db) {
|
|
|
393
394
|
`.execute(db);
|
|
394
395
|
}
|
|
395
396
|
}
|
|
396
|
-
async function down$
|
|
397
|
+
async function down$27(db) {
|
|
397
398
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
398
399
|
for (const tableName of tableNames) {
|
|
399
400
|
const table = { name: tableName };
|
|
@@ -410,10 +411,10 @@ async function down$26(db) {
|
|
|
410
411
|
//#endregion
|
|
411
412
|
//#region src/database/migrations/014_draft_revisions.ts
|
|
412
413
|
var _014_draft_revisions_exports = /* @__PURE__ */ __exportAll({
|
|
413
|
-
down: () => down$
|
|
414
|
-
up: () => up$
|
|
414
|
+
down: () => down$26,
|
|
415
|
+
up: () => up$26
|
|
415
416
|
});
|
|
416
|
-
async function up$
|
|
417
|
+
async function up$26(db) {
|
|
417
418
|
const tables = await db.selectFrom("_emdash_collections").select("slug").execute();
|
|
418
419
|
for (const row of tables) {
|
|
419
420
|
const tableName = `ec_${row.slug}`;
|
|
@@ -435,7 +436,7 @@ async function up$25(db) {
|
|
|
435
436
|
`.execute(db);
|
|
436
437
|
}
|
|
437
438
|
}
|
|
438
|
-
async function down$
|
|
439
|
+
async function down$26(db) {
|
|
439
440
|
const tables = await db.selectFrom("_emdash_collections").select("slug").execute();
|
|
440
441
|
for (const row of tables) {
|
|
441
442
|
const tableName = `ec_${row.slug}`;
|
|
@@ -459,8 +460,8 @@ async function down$25(db) {
|
|
|
459
460
|
//#endregion
|
|
460
461
|
//#region src/database/migrations/015_indexes.ts
|
|
461
462
|
var _015_indexes_exports = /* @__PURE__ */ __exportAll({
|
|
462
|
-
down: () => down$
|
|
463
|
-
up: () => up$
|
|
463
|
+
down: () => down$25,
|
|
464
|
+
up: () => up$25
|
|
464
465
|
});
|
|
465
466
|
/**
|
|
466
467
|
* Add performance indexes for common query patterns.
|
|
@@ -473,7 +474,7 @@ var _015_indexes_exports = /* @__PURE__ */ __exportAll({
|
|
|
473
474
|
* 5. Retroactive author_id + updated_at on existing ec_* content tables
|
|
474
475
|
* (new tables get these from createContentTable() in registry.ts)
|
|
475
476
|
*/
|
|
476
|
-
async function up$
|
|
477
|
+
async function up$25(db) {
|
|
477
478
|
await db.schema.createIndex("idx_media_mime_type").on("media").column("mime_type").execute();
|
|
478
479
|
await db.schema.createIndex("idx_media_filename").on("media").column("filename").execute();
|
|
479
480
|
await db.schema.createIndex("idx_media_created_at").on("media").column("created_at").execute();
|
|
@@ -493,7 +494,7 @@ async function up$24(db) {
|
|
|
493
494
|
`.execute(db);
|
|
494
495
|
}
|
|
495
496
|
}
|
|
496
|
-
async function down$
|
|
497
|
+
async function down$25(db) {
|
|
497
498
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
498
499
|
for (const tableName of tableNames) {
|
|
499
500
|
const table = { name: tableName };
|
|
@@ -511,8 +512,8 @@ async function down$24(db) {
|
|
|
511
512
|
//#endregion
|
|
512
513
|
//#region src/database/migrations/016_api_tokens.ts
|
|
513
514
|
var _016_api_tokens_exports = /* @__PURE__ */ __exportAll({
|
|
514
|
-
down: () => down$
|
|
515
|
-
up: () => up$
|
|
515
|
+
down: () => down$24,
|
|
516
|
+
up: () => up$24
|
|
516
517
|
});
|
|
517
518
|
/**
|
|
518
519
|
* API token tables for programmatic access.
|
|
@@ -530,7 +531,7 @@ var _016_api_tokens_exports = /* @__PURE__ */ __exportAll({
|
|
|
530
531
|
* top. Without these guards, the retry crashed with `table ... already
|
|
531
532
|
* exists` and blocked every subsequent boot of the Worker.
|
|
532
533
|
*/
|
|
533
|
-
async function up$
|
|
534
|
+
async function up$24(db) {
|
|
534
535
|
await db.schema.createTable("_emdash_api_tokens").ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("token_hash", "text", (col) => col.notNull().unique()).addColumn("prefix", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("expires_at", "text").addColumn("last_used_at", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("api_tokens_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
|
|
535
536
|
await db.schema.createIndex("idx_api_tokens_token_hash").ifNotExists().on("_emdash_api_tokens").column("token_hash").execute();
|
|
536
537
|
await db.schema.createIndex("idx_api_tokens_user_id").ifNotExists().on("_emdash_api_tokens").column("user_id").execute();
|
|
@@ -539,7 +540,7 @@ async function up$23(db) {
|
|
|
539
540
|
await db.schema.createIndex("idx_oauth_tokens_expires").ifNotExists().on("_emdash_oauth_tokens").column("expires_at").execute();
|
|
540
541
|
await db.schema.createTable("_emdash_device_codes").ifNotExists().addColumn("device_code", "text", (col) => col.primaryKey()).addColumn("user_code", "text", (col) => col.notNull().unique()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("user_id", "text").addColumn("status", "text", (col) => col.notNull().defaultTo("pending")).addColumn("expires_at", "text", (col) => col.notNull()).addColumn("interval", "integer", (col) => col.notNull().defaultTo(5)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
541
542
|
}
|
|
542
|
-
async function down$
|
|
543
|
+
async function down$24(db) {
|
|
543
544
|
await db.schema.dropTable("_emdash_device_codes").ifExists().execute();
|
|
544
545
|
await db.schema.dropTable("_emdash_oauth_tokens").ifExists().execute();
|
|
545
546
|
await db.schema.dropTable("_emdash_api_tokens").ifExists().execute();
|
|
@@ -548,8 +549,8 @@ async function down$23(db) {
|
|
|
548
549
|
//#endregion
|
|
549
550
|
//#region src/database/migrations/017_authorization_codes.ts
|
|
550
551
|
var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
|
|
551
|
-
down: () => down$
|
|
552
|
-
up: () => up$
|
|
552
|
+
down: () => down$23,
|
|
553
|
+
up: () => up$23
|
|
553
554
|
});
|
|
554
555
|
/**
|
|
555
556
|
* Authorization codes for OAuth 2.1 Authorization Code + PKCE flow.
|
|
@@ -559,20 +560,20 @@ var _017_authorization_codes_exports = /* @__PURE__ */ __exportAll({
|
|
|
559
560
|
*
|
|
560
561
|
* Also adds client_id tracking to oauth_tokens for per-client revocation.
|
|
561
562
|
*/
|
|
562
|
-
async function up$
|
|
563
|
+
async function up$23(db) {
|
|
563
564
|
await db.schema.createTable("_emdash_authorization_codes").addColumn("code_hash", "text", (col) => col.primaryKey()).addColumn("client_id", "text", (col) => col.notNull()).addColumn("redirect_uri", "text", (col) => col.notNull()).addColumn("user_id", "text", (col) => col.notNull()).addColumn("scopes", "text", (col) => col.notNull()).addColumn("code_challenge", "text", (col) => col.notNull()).addColumn("code_challenge_method", "text", (col) => col.notNull().defaultTo("S256")).addColumn("resource", "text").addColumn("expires_at", "text", (col) => col.notNull()).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addForeignKeyConstraint("auth_codes_user_fk", ["user_id"], "users", ["id"], (cb) => cb.onDelete("cascade")).execute();
|
|
564
565
|
await db.schema.createIndex("idx_auth_codes_expires").on("_emdash_authorization_codes").column("expires_at").execute();
|
|
565
566
|
await sql`ALTER TABLE _emdash_oauth_tokens ADD COLUMN client_id TEXT`.execute(db);
|
|
566
567
|
}
|
|
567
|
-
async function down$
|
|
568
|
+
async function down$23(db) {
|
|
568
569
|
await db.schema.dropTable("_emdash_authorization_codes").execute();
|
|
569
570
|
}
|
|
570
571
|
|
|
571
572
|
//#endregion
|
|
572
573
|
//#region src/database/migrations/018_seo.ts
|
|
573
574
|
var _018_seo_exports = /* @__PURE__ */ __exportAll({
|
|
574
|
-
down: () => down$
|
|
575
|
-
up: () => up$
|
|
575
|
+
down: () => down$22,
|
|
576
|
+
up: () => up$22
|
|
576
577
|
});
|
|
577
578
|
/**
|
|
578
579
|
* Migration: SEO support
|
|
@@ -585,7 +586,7 @@ var _018_seo_exports = /* @__PURE__ */ __exportAll({
|
|
|
585
586
|
* need it. The `has_seo` flag controls whether the admin shows SEO fields
|
|
586
587
|
* and whether the collection's content appears in sitemaps.
|
|
587
588
|
*/
|
|
588
|
-
async function up$
|
|
589
|
+
async function up$22(db) {
|
|
589
590
|
await db.schema.createTable("_emdash_seo").addColumn("collection", "text", (col) => col.notNull()).addColumn("content_id", "text", (col) => col.notNull()).addColumn("seo_title", "text").addColumn("seo_description", "text").addColumn("seo_image", "text").addColumn("seo_canonical", "text").addColumn("seo_no_index", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.notNull().defaultTo(currentTimestamp(db))).addPrimaryKeyConstraint("_emdash_seo_pk", ["collection", "content_id"]).execute();
|
|
590
591
|
await sql`
|
|
591
592
|
CREATE INDEX idx_emdash_seo_collection
|
|
@@ -596,7 +597,7 @@ async function up$21(db) {
|
|
|
596
597
|
ADD COLUMN has_seo INTEGER NOT NULL DEFAULT 0
|
|
597
598
|
`.execute(db);
|
|
598
599
|
}
|
|
599
|
-
async function down$
|
|
600
|
+
async function down$22(db) {
|
|
600
601
|
await sql`DROP TABLE IF EXISTS _emdash_seo`.execute(db);
|
|
601
602
|
await sql`
|
|
602
603
|
ALTER TABLE _emdash_collections
|
|
@@ -607,8 +608,8 @@ async function down$21(db) {
|
|
|
607
608
|
//#endregion
|
|
608
609
|
//#region src/database/migrations/019_i18n.ts
|
|
609
610
|
var _019_i18n_exports = /* @__PURE__ */ __exportAll({
|
|
610
|
-
down: () => down$
|
|
611
|
-
up: () => up$
|
|
611
|
+
down: () => down$21,
|
|
612
|
+
up: () => up$21
|
|
612
613
|
});
|
|
613
614
|
/**
|
|
614
615
|
* Quote an identifier for use in raw SQL. Escapes embedded double-quotes
|
|
@@ -721,7 +722,7 @@ async function upPostgres$1(db) {
|
|
|
721
722
|
ADD COLUMN translatable INTEGER NOT NULL DEFAULT 1
|
|
722
723
|
`.execute(db);
|
|
723
724
|
}
|
|
724
|
-
async function up$
|
|
725
|
+
async function up$21(db) {
|
|
725
726
|
if (!isSqlite(db)) return upPostgres$1(db);
|
|
726
727
|
const orphanedTmps = await listTablesLike(db, "ec_%_i18n_tmp");
|
|
727
728
|
for (const tmpName of orphanedTmps) {
|
|
@@ -838,7 +839,7 @@ async function downPostgres(db) {
|
|
|
838
839
|
await sql`ALTER TABLE ${sql.ref(t)} DROP COLUMN translation_group`.execute(db);
|
|
839
840
|
}
|
|
840
841
|
}
|
|
841
|
-
async function down$
|
|
842
|
+
async function down$21(db) {
|
|
842
843
|
if (!isSqlite(db)) return downPostgres(db);
|
|
843
844
|
await sql`
|
|
844
845
|
ALTER TABLE _emdash_fields
|
|
@@ -945,8 +946,8 @@ async function down$20(db) {
|
|
|
945
946
|
//#endregion
|
|
946
947
|
//#region src/database/migrations/020_collection_url_pattern.ts
|
|
947
948
|
var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
|
|
948
|
-
down: () => down$
|
|
949
|
-
up: () => up$
|
|
949
|
+
down: () => down$20,
|
|
950
|
+
up: () => up$20
|
|
950
951
|
});
|
|
951
952
|
/**
|
|
952
953
|
* Migration: URL pattern for collections
|
|
@@ -955,13 +956,13 @@ var _020_collection_url_pattern_exports = /* @__PURE__ */ __exportAll({
|
|
|
955
956
|
* can declare its own URL structure (e.g. "/{slug}" for pages, "/blog/{slug}"
|
|
956
957
|
* for posts). Used for menu URL resolution, sitemaps, and path-based lookups.
|
|
957
958
|
*/
|
|
958
|
-
async function up$
|
|
959
|
+
async function up$20(db) {
|
|
959
960
|
await sql`
|
|
960
961
|
ALTER TABLE _emdash_collections
|
|
961
962
|
ADD COLUMN url_pattern TEXT
|
|
962
963
|
`.execute(db);
|
|
963
964
|
}
|
|
964
|
-
async function down$
|
|
965
|
+
async function down$20(db) {
|
|
965
966
|
await sql`
|
|
966
967
|
ALTER TABLE _emdash_collections
|
|
967
968
|
DROP COLUMN url_pattern
|
|
@@ -971,8 +972,8 @@ async function down$19(db) {
|
|
|
971
972
|
//#endregion
|
|
972
973
|
//#region src/database/migrations/021_remove_section_categories.ts
|
|
973
974
|
var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
|
|
974
|
-
down: () => down$
|
|
975
|
-
up: () => up$
|
|
975
|
+
down: () => down$19,
|
|
976
|
+
up: () => up$19
|
|
976
977
|
});
|
|
977
978
|
/**
|
|
978
979
|
* Migration: Remove section categories
|
|
@@ -981,12 +982,12 @@ var _021_remove_section_categories_exports = /* @__PURE__ */ __exportAll({
|
|
|
981
982
|
* Rather than building the missing UI for a feature with very little need at this stage,
|
|
982
983
|
* we're removing the feature entirely.
|
|
983
984
|
*/
|
|
984
|
-
async function up$
|
|
985
|
+
async function up$19(db) {
|
|
985
986
|
await db.schema.dropIndex("idx_sections_category").ifExists().execute();
|
|
986
987
|
await db.schema.alterTable("_emdash_sections").dropColumn("category_id").execute();
|
|
987
988
|
await db.schema.dropTable("_emdash_section_categories").execute();
|
|
988
989
|
}
|
|
989
|
-
async function down$
|
|
990
|
+
async function down$19(db) {
|
|
990
991
|
await db.schema.createTable("_emdash_section_categories").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("label", "text", (col) => col.notNull()).addColumn("sort_order", "integer", (col) => col.defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
991
992
|
await db.schema.alterTable("_emdash_sections").addColumn("category_id", "text", (col) => col.references("_emdash_section_categories.id").onDelete("set null")).execute();
|
|
992
993
|
await db.schema.createIndex("idx_sections_category").on("_emdash_sections").columns(["category_id"]).execute();
|
|
@@ -995,8 +996,8 @@ async function down$18(db) {
|
|
|
995
996
|
//#endregion
|
|
996
997
|
//#region src/database/migrations/022_marketplace_plugin_state.ts
|
|
997
998
|
var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
|
|
998
|
-
down: () => down$
|
|
999
|
-
up: () => up$
|
|
999
|
+
down: () => down$18,
|
|
1000
|
+
up: () => up$18
|
|
1000
1001
|
});
|
|
1001
1002
|
/**
|
|
1002
1003
|
* Migration: Add marketplace fields to _plugin_state
|
|
@@ -1005,7 +1006,7 @@ var _022_marketplace_plugin_state_exports = /* @__PURE__ */ __exportAll({
|
|
|
1005
1006
|
* whether a plugin was installed from config or marketplace,
|
|
1006
1007
|
* and which marketplace version is installed.
|
|
1007
1008
|
*/
|
|
1008
|
-
async function up$
|
|
1009
|
+
async function up$18(db) {
|
|
1009
1010
|
await sql`
|
|
1010
1011
|
ALTER TABLE _plugin_state
|
|
1011
1012
|
ADD COLUMN source TEXT NOT NULL DEFAULT 'config'
|
|
@@ -1020,7 +1021,7 @@ async function up$17(db) {
|
|
|
1020
1021
|
WHERE source = 'marketplace'
|
|
1021
1022
|
`.execute(db);
|
|
1022
1023
|
}
|
|
1023
|
-
async function down$
|
|
1024
|
+
async function down$18(db) {
|
|
1024
1025
|
await sql`
|
|
1025
1026
|
DROP INDEX IF EXISTS idx_plugin_state_source
|
|
1026
1027
|
`.execute(db);
|
|
@@ -1037,8 +1038,8 @@ async function down$17(db) {
|
|
|
1037
1038
|
//#endregion
|
|
1038
1039
|
//#region src/database/migrations/023_plugin_metadata.ts
|
|
1039
1040
|
var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
|
|
1040
|
-
down: () => down$
|
|
1041
|
-
up: () => up$
|
|
1041
|
+
down: () => down$17,
|
|
1042
|
+
up: () => up$17
|
|
1042
1043
|
});
|
|
1043
1044
|
/**
|
|
1044
1045
|
* Migration: Add display metadata to _plugin_state
|
|
@@ -1047,7 +1048,7 @@ var _023_plugin_metadata_exports = /* @__PURE__ */ __exportAll({
|
|
|
1047
1048
|
* so the admin UI can show meaningful info without re-fetching
|
|
1048
1049
|
* from the marketplace on every page load.
|
|
1049
1050
|
*/
|
|
1050
|
-
async function up$
|
|
1051
|
+
async function up$17(db) {
|
|
1051
1052
|
await sql`
|
|
1052
1053
|
ALTER TABLE _plugin_state
|
|
1053
1054
|
ADD COLUMN display_name TEXT
|
|
@@ -1057,7 +1058,7 @@ async function up$16(db) {
|
|
|
1057
1058
|
ADD COLUMN description TEXT
|
|
1058
1059
|
`.execute(db);
|
|
1059
1060
|
}
|
|
1060
|
-
async function down$
|
|
1061
|
+
async function down$17(db) {
|
|
1061
1062
|
await sql`
|
|
1062
1063
|
ALTER TABLE _plugin_state
|
|
1063
1064
|
DROP COLUMN description
|
|
@@ -1071,8 +1072,8 @@ async function down$16(db) {
|
|
|
1071
1072
|
//#endregion
|
|
1072
1073
|
//#region src/database/migrations/024_media_placeholders.ts
|
|
1073
1074
|
var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
|
|
1074
|
-
down: () => down$
|
|
1075
|
-
up: () => up$
|
|
1075
|
+
down: () => down$16,
|
|
1076
|
+
up: () => up$16
|
|
1076
1077
|
});
|
|
1077
1078
|
/**
|
|
1078
1079
|
* Migration: Add placeholder columns to media table
|
|
@@ -1080,7 +1081,7 @@ var _024_media_placeholders_exports = /* @__PURE__ */ __exportAll({
|
|
|
1080
1081
|
* Stores blurhash and dominant_color for LQIP (Low Quality Image Placeholder)
|
|
1081
1082
|
* support. Generated at upload time from image pixel data.
|
|
1082
1083
|
*/
|
|
1083
|
-
async function up$
|
|
1084
|
+
async function up$16(db) {
|
|
1084
1085
|
await sql`
|
|
1085
1086
|
ALTER TABLE media
|
|
1086
1087
|
ADD COLUMN blurhash TEXT
|
|
@@ -1090,7 +1091,7 @@ async function up$15(db) {
|
|
|
1090
1091
|
ADD COLUMN dominant_color TEXT
|
|
1091
1092
|
`.execute(db);
|
|
1092
1093
|
}
|
|
1093
|
-
async function down$
|
|
1094
|
+
async function down$16(db) {
|
|
1094
1095
|
await sql`
|
|
1095
1096
|
ALTER TABLE media
|
|
1096
1097
|
DROP COLUMN dominant_color
|
|
@@ -1104,8 +1105,8 @@ async function down$15(db) {
|
|
|
1104
1105
|
//#endregion
|
|
1105
1106
|
//#region src/database/migrations/025_oauth_clients.ts
|
|
1106
1107
|
var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
|
|
1107
|
-
down: () => down$
|
|
1108
|
-
up: () => up$
|
|
1108
|
+
down: () => down$15,
|
|
1109
|
+
up: () => up$15
|
|
1109
1110
|
});
|
|
1110
1111
|
/**
|
|
1111
1112
|
* Migration: Create OAuth clients table
|
|
@@ -1116,18 +1117,18 @@ var _025_oauth_clients_exports = /* @__PURE__ */ __exportAll({
|
|
|
1116
1117
|
* Each client has a set of pre-registered redirect URIs (JSON array).
|
|
1117
1118
|
* The authorize endpoint rejects any redirect_uri not in the client's list.
|
|
1118
1119
|
*/
|
|
1119
|
-
async function up$
|
|
1120
|
+
async function up$15(db) {
|
|
1120
1121
|
await db.schema.createTable("_emdash_oauth_clients").addColumn("id", "text", (col) => col.primaryKey()).addColumn("name", "text", (col) => col.notNull()).addColumn("redirect_uris", "text", (col) => col.notNull()).addColumn("scopes", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
1121
1122
|
}
|
|
1122
|
-
async function down$
|
|
1123
|
+
async function down$15(db) {
|
|
1123
1124
|
await db.schema.dropTable("_emdash_oauth_clients").execute();
|
|
1124
1125
|
}
|
|
1125
1126
|
|
|
1126
1127
|
//#endregion
|
|
1127
1128
|
//#region src/database/migrations/026_cron_tasks.ts
|
|
1128
1129
|
var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
|
|
1129
|
-
down: () => down$
|
|
1130
|
-
up: () => up$
|
|
1130
|
+
down: () => down$14,
|
|
1131
|
+
up: () => up$14
|
|
1131
1132
|
});
|
|
1132
1133
|
/**
|
|
1133
1134
|
* Migration: Create cron tasks table for plugin scheduled tasks.
|
|
@@ -1138,7 +1139,7 @@ var _026_cron_tasks_exports = /* @__PURE__ */ __exportAll({
|
|
|
1138
1139
|
* The `next_run_at` + `status` + `enabled` index drives the "find overdue
|
|
1139
1140
|
* tasks" query used by CronExecutor.tick().
|
|
1140
1141
|
*/
|
|
1141
|
-
async function up$
|
|
1142
|
+
async function up$14(db) {
|
|
1142
1143
|
await db.schema.createTable("_emdash_cron_tasks").addColumn("id", "text", (col) => col.primaryKey()).addColumn("plugin_id", "text", (col) => col.notNull()).addColumn("task_name", "text", (col) => col.notNull()).addColumn("schedule", "text", (col) => col.notNull()).addColumn("is_oneshot", "integer", (col) => col.notNull().defaultTo(0)).addColumn("data", "text").addColumn("next_run_at", "text", (col) => col.notNull()).addColumn("last_run_at", "text").addColumn("status", "text", (col) => col.notNull().defaultTo("idle")).addColumn("locked_at", "text").addColumn("enabled", "integer", (col) => col.notNull().defaultTo(1)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addUniqueConstraint("uq_cron_tasks_plugin_task", ["plugin_id", "task_name"]).execute();
|
|
1143
1144
|
await db.schema.createIndex("idx_cron_tasks_due").on("_emdash_cron_tasks").columns([
|
|
1144
1145
|
"enabled",
|
|
@@ -1147,17 +1148,17 @@ async function up$13(db) {
|
|
|
1147
1148
|
]).execute();
|
|
1148
1149
|
await db.schema.createIndex("idx_cron_tasks_plugin").on("_emdash_cron_tasks").column("plugin_id").execute();
|
|
1149
1150
|
}
|
|
1150
|
-
async function down$
|
|
1151
|
+
async function down$14(db) {
|
|
1151
1152
|
await db.schema.dropTable("_emdash_cron_tasks").execute();
|
|
1152
1153
|
}
|
|
1153
1154
|
|
|
1154
1155
|
//#endregion
|
|
1155
1156
|
//#region src/database/migrations/027_comments.ts
|
|
1156
1157
|
var _027_comments_exports = /* @__PURE__ */ __exportAll({
|
|
1157
|
-
down: () => down$
|
|
1158
|
-
up: () => up$
|
|
1158
|
+
down: () => down$13,
|
|
1159
|
+
up: () => up$13
|
|
1159
1160
|
});
|
|
1160
|
-
async function up$
|
|
1161
|
+
async function up$13(db) {
|
|
1161
1162
|
await db.schema.createTable("_emdash_comments").addColumn("id", "text", (col) => col.primaryKey()).addColumn("collection", "text", (col) => col.notNull()).addColumn("content_id", "text", (col) => col.notNull()).addColumn("parent_id", "text", (col) => col.references("_emdash_comments.id").onDelete("cascade")).addColumn("author_name", "text", (col) => col.notNull()).addColumn("author_email", "text", (col) => col.notNull()).addColumn("author_url", "text").addColumn("author_user_id", "text", (col) => col.references("users.id").onDelete("set null")).addColumn("body", "text", (col) => col.notNull()).addColumn("status", "text", (col) => col.notNull().defaultTo("pending")).addColumn("ip_hash", "text").addColumn("user_agent", "text").addColumn("moderation_metadata", "text").addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
1162
1163
|
await db.schema.createIndex("idx_comments_content").on("_emdash_comments").columns([
|
|
1163
1164
|
"collection",
|
|
@@ -1173,30 +1174,30 @@ async function up$12(db) {
|
|
|
1173
1174
|
await db.schema.alterTable("_emdash_collections").addColumn("comments_closed_after_days", "integer", (col) => col.defaultTo(90)).execute();
|
|
1174
1175
|
await db.schema.alterTable("_emdash_collections").addColumn("comments_auto_approve_users", "integer", (col) => col.defaultTo(1)).execute();
|
|
1175
1176
|
}
|
|
1176
|
-
async function down$
|
|
1177
|
+
async function down$13(db) {
|
|
1177
1178
|
await db.schema.dropTable("_emdash_comments").execute();
|
|
1178
1179
|
}
|
|
1179
1180
|
|
|
1180
1181
|
//#endregion
|
|
1181
1182
|
//#region src/database/migrations/028_drop_author_url.ts
|
|
1182
1183
|
var _028_drop_author_url_exports = /* @__PURE__ */ __exportAll({
|
|
1183
|
-
down: () => down$
|
|
1184
|
-
up: () => up$
|
|
1184
|
+
down: () => down$12,
|
|
1185
|
+
up: () => up$12
|
|
1185
1186
|
});
|
|
1186
|
-
async function up$
|
|
1187
|
+
async function up$12(db) {
|
|
1187
1188
|
await sql`ALTER TABLE _emdash_comments DROP COLUMN author_url`.execute(db);
|
|
1188
1189
|
}
|
|
1189
|
-
async function down$
|
|
1190
|
+
async function down$12(db) {
|
|
1190
1191
|
await db.schema.alterTable("_emdash_comments").addColumn("author_url", "text").execute();
|
|
1191
1192
|
}
|
|
1192
1193
|
|
|
1193
1194
|
//#endregion
|
|
1194
1195
|
//#region src/database/migrations/029_redirects.ts
|
|
1195
1196
|
var _029_redirects_exports = /* @__PURE__ */ __exportAll({
|
|
1196
|
-
down: () => down$
|
|
1197
|
-
up: () => up$
|
|
1197
|
+
down: () => down$11,
|
|
1198
|
+
up: () => up$11
|
|
1198
1199
|
});
|
|
1199
|
-
async function up$
|
|
1200
|
+
async function up$11(db) {
|
|
1200
1201
|
await db.schema.createTable("_emdash_redirects").addColumn("id", "text", (col) => col.primaryKey()).addColumn("source", "text", (col) => col.notNull()).addColumn("destination", "text", (col) => col.notNull()).addColumn("type", "integer", (col) => col.notNull().defaultTo(301)).addColumn("is_pattern", "integer", (col) => col.notNull().defaultTo(0)).addColumn("enabled", "integer", (col) => col.notNull().defaultTo(1)).addColumn("hits", "integer", (col) => col.notNull().defaultTo(0)).addColumn("last_hit_at", "text").addColumn("group_name", "text").addColumn("auto", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
1201
1202
|
await db.schema.createIndex("idx_redirects_source").on("_emdash_redirects").column("source").execute();
|
|
1202
1203
|
await db.schema.createIndex("idx_redirects_enabled").on("_emdash_redirects").column("enabled").execute();
|
|
@@ -1205,7 +1206,7 @@ async function up$10(db) {
|
|
|
1205
1206
|
await db.schema.createIndex("idx_404_log_path").on("_emdash_404_log").column("path").execute();
|
|
1206
1207
|
await db.schema.createIndex("idx_404_log_created").on("_emdash_404_log").column("created_at").execute();
|
|
1207
1208
|
}
|
|
1208
|
-
async function down$
|
|
1209
|
+
async function down$11(db) {
|
|
1209
1210
|
await db.schema.dropTable("_emdash_404_log").execute();
|
|
1210
1211
|
await db.schema.dropTable("_emdash_redirects").execute();
|
|
1211
1212
|
}
|
|
@@ -1213,8 +1214,8 @@ async function down$10(db) {
|
|
|
1213
1214
|
//#endregion
|
|
1214
1215
|
//#region src/database/migrations/030_widen_scheduled_index.ts
|
|
1215
1216
|
var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
|
|
1216
|
-
down: () => down$
|
|
1217
|
-
up: () => up$
|
|
1217
|
+
down: () => down$10,
|
|
1218
|
+
up: () => up$10
|
|
1218
1219
|
});
|
|
1219
1220
|
/**
|
|
1220
1221
|
* Migration: Widen scheduled publishing index
|
|
@@ -1223,7 +1224,7 @@ var _030_widen_scheduled_index_exports = /* @__PURE__ */ __exportAll({
|
|
|
1223
1224
|
* Published posts can now have scheduled draft changes, so widen the
|
|
1224
1225
|
* index to cover all rows where scheduled_at IS NOT NULL.
|
|
1225
1226
|
*/
|
|
1226
|
-
async function up$
|
|
1227
|
+
async function up$10(db) {
|
|
1227
1228
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1228
1229
|
for (const tableName of tableNames) {
|
|
1229
1230
|
const table = { name: tableName };
|
|
@@ -1237,7 +1238,7 @@ async function up$9(db) {
|
|
|
1237
1238
|
`.execute(db);
|
|
1238
1239
|
}
|
|
1239
1240
|
}
|
|
1240
|
-
async function down$
|
|
1241
|
+
async function down$10(db) {
|
|
1241
1242
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1242
1243
|
for (const tableName of tableNames) {
|
|
1243
1244
|
const table = { name: tableName };
|
|
@@ -1255,10 +1256,10 @@ async function down$9(db) {
|
|
|
1255
1256
|
//#endregion
|
|
1256
1257
|
//#region src/database/migrations/031_bylines.ts
|
|
1257
1258
|
var _031_bylines_exports = /* @__PURE__ */ __exportAll({
|
|
1258
|
-
down: () => down$
|
|
1259
|
-
up: () => up$
|
|
1259
|
+
down: () => down$9,
|
|
1260
|
+
up: () => up$9
|
|
1260
1261
|
});
|
|
1261
|
-
async function up$
|
|
1262
|
+
async function up$9(db) {
|
|
1262
1263
|
await db.schema.createTable("_emdash_bylines").addColumn("id", "text", (col) => col.primaryKey()).addColumn("slug", "text", (col) => col.notNull().unique()).addColumn("display_name", "text", (col) => col.notNull()).addColumn("bio", "text").addColumn("avatar_media_id", "text", (col) => col.references("media.id").onDelete("set null")).addColumn("website_url", "text").addColumn("user_id", "text", (col) => col.references("users.id").onDelete("set null")).addColumn("is_guest", "integer", (col) => col.notNull().defaultTo(0)).addColumn("created_at", "text", (col) => col.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (col) => col.defaultTo(currentTimestamp(db))).execute();
|
|
1263
1264
|
await sql`
|
|
1264
1265
|
CREATE UNIQUE INDEX ${sql.ref("idx_bylines_user_id_unique")}
|
|
@@ -1290,7 +1291,7 @@ async function up$8(db) {
|
|
|
1290
1291
|
`.execute(db);
|
|
1291
1292
|
}
|
|
1292
1293
|
}
|
|
1293
|
-
async function down$
|
|
1294
|
+
async function down$9(db) {
|
|
1294
1295
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1295
1296
|
for (const tableName of tableNames) {
|
|
1296
1297
|
await sql`
|
|
@@ -1308,8 +1309,8 @@ async function down$8(db) {
|
|
|
1308
1309
|
//#endregion
|
|
1309
1310
|
//#region src/database/migrations/032_rate_limits.ts
|
|
1310
1311
|
var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
|
|
1311
|
-
down: () => down$
|
|
1312
|
-
up: () => up$
|
|
1312
|
+
down: () => down$8,
|
|
1313
|
+
up: () => up$8
|
|
1313
1314
|
});
|
|
1314
1315
|
/**
|
|
1315
1316
|
* Migration: Rate limits table + device code polling tracking.
|
|
@@ -1320,12 +1321,12 @@ var _032_rate_limits_exports = /* @__PURE__ */ __exportAll({
|
|
|
1320
1321
|
* 2. Add last_polled_at column to _emdash_device_codes for
|
|
1321
1322
|
* RFC 8628 slow_down enforcement.
|
|
1322
1323
|
*/
|
|
1323
|
-
async function up$
|
|
1324
|
+
async function up$8(db) {
|
|
1324
1325
|
await db.schema.createTable("_emdash_rate_limits").addColumn("key", "text", (col) => col.notNull()).addColumn("window", "text", (col) => col.notNull()).addColumn("count", "integer", (col) => col.notNull().defaultTo(1)).addPrimaryKeyConstraint("pk_rate_limits", ["key", "window"]).execute();
|
|
1325
1326
|
await db.schema.createIndex("idx_rate_limits_window").on("_emdash_rate_limits").column("window").execute();
|
|
1326
1327
|
await db.schema.alterTable("_emdash_device_codes").addColumn("last_polled_at", "text").execute();
|
|
1327
1328
|
}
|
|
1328
|
-
async function down$
|
|
1329
|
+
async function down$8(db) {
|
|
1329
1330
|
await db.schema.dropTable("_emdash_rate_limits").execute();
|
|
1330
1331
|
await db.schema.alterTable("_emdash_device_codes").dropColumn("last_polled_at").execute();
|
|
1331
1332
|
}
|
|
@@ -1333,8 +1334,8 @@ async function down$7(db) {
|
|
|
1333
1334
|
//#endregion
|
|
1334
1335
|
//#region src/database/migrations/033_optimize_content_indexes.ts
|
|
1335
1336
|
var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
|
|
1336
|
-
down: () => down$
|
|
1337
|
-
up: () => up$
|
|
1337
|
+
down: () => down$7,
|
|
1338
|
+
up: () => up$7
|
|
1338
1339
|
});
|
|
1339
1340
|
/**
|
|
1340
1341
|
* Migration: Optimize content table indexes for D1 performance
|
|
@@ -1347,7 +1348,7 @@ var _033_optimize_content_indexes_exports = /* @__PURE__ */ __exportAll({
|
|
|
1347
1348
|
*
|
|
1348
1349
|
* Impact: Reduces D1 row reads by 90%+ for admin panel operations.
|
|
1349
1350
|
*/
|
|
1350
|
-
async function up$
|
|
1351
|
+
async function up$7(db) {
|
|
1351
1352
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1352
1353
|
for (const tableName of tableNames) {
|
|
1353
1354
|
const table = { name: tableName };
|
|
@@ -1389,7 +1390,7 @@ async function up$6(db) {
|
|
|
1389
1390
|
WHERE status = 'trash'
|
|
1390
1391
|
`.execute(db);
|
|
1391
1392
|
}
|
|
1392
|
-
async function down$
|
|
1393
|
+
async function down$7(db) {
|
|
1393
1394
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1394
1395
|
for (const tableName of tableNames) {
|
|
1395
1396
|
const table = { name: tableName };
|
|
@@ -1422,10 +1423,10 @@ async function down$6(db) {
|
|
|
1422
1423
|
//#endregion
|
|
1423
1424
|
//#region src/database/migrations/034_published_at_index.ts
|
|
1424
1425
|
var _034_published_at_index_exports = /* @__PURE__ */ __exportAll({
|
|
1425
|
-
down: () => down$
|
|
1426
|
-
up: () => up$
|
|
1426
|
+
down: () => down$6,
|
|
1427
|
+
up: () => up$6
|
|
1427
1428
|
});
|
|
1428
|
-
async function up$
|
|
1429
|
+
async function up$6(db) {
|
|
1429
1430
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1430
1431
|
for (const tableName of tableNames) {
|
|
1431
1432
|
const table = { name: tableName };
|
|
@@ -1435,7 +1436,7 @@ async function up$5(db) {
|
|
|
1435
1436
|
`.execute(db);
|
|
1436
1437
|
}
|
|
1437
1438
|
}
|
|
1438
|
-
async function down$
|
|
1439
|
+
async function down$6(db) {
|
|
1439
1440
|
const tableNames = await listTablesLike(db, "ec_%");
|
|
1440
1441
|
for (const tableName of tableNames) {
|
|
1441
1442
|
const table = { name: tableName };
|
|
@@ -1446,8 +1447,8 @@ async function down$5(db) {
|
|
|
1446
1447
|
//#endregion
|
|
1447
1448
|
//#region src/database/migrations/035_bounded_404_log.ts
|
|
1448
1449
|
var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
|
|
1449
|
-
down: () => down$
|
|
1450
|
-
up: () => up$
|
|
1450
|
+
down: () => down$5,
|
|
1451
|
+
up: () => up$5
|
|
1451
1452
|
});
|
|
1452
1453
|
/**
|
|
1453
1454
|
* Migration: Bounded 404 logging
|
|
@@ -1465,7 +1466,7 @@ var _035_bounded_404_log_exports = /* @__PURE__ */ __exportAll({
|
|
|
1465
1466
|
* path and summing hits
|
|
1466
1467
|
* - Adds a UNIQUE index on `path` so upsert semantics work
|
|
1467
1468
|
*/
|
|
1468
|
-
async function up$
|
|
1469
|
+
async function up$5(db) {
|
|
1469
1470
|
const hitsExists = await columnExists(db, "_emdash_404_log", "hits");
|
|
1470
1471
|
if (!hitsExists) await db.schema.alterTable("_emdash_404_log").addColumn("hits", "integer", (col) => col.notNull().defaultTo(1)).execute();
|
|
1471
1472
|
if (!await columnExists(db, "_emdash_404_log", "last_seen_at")) await db.schema.alterTable("_emdash_404_log").addColumn("last_seen_at", "text").execute();
|
|
@@ -1514,7 +1515,7 @@ async function up$4(db) {
|
|
|
1514
1515
|
await db.schema.dropIndex("idx_404_log_path").ifExists().execute();
|
|
1515
1516
|
await db.schema.createIndex("idx_404_log_last_seen").ifNotExists().on("_emdash_404_log").column("last_seen_at").execute();
|
|
1516
1517
|
}
|
|
1517
|
-
async function down$
|
|
1518
|
+
async function down$5(db) {
|
|
1518
1519
|
await db.schema.dropIndex("idx_404_log_last_seen").ifExists().execute();
|
|
1519
1520
|
await db.schema.dropIndex("idx_404_log_path_unique").ifExists().execute();
|
|
1520
1521
|
await db.schema.createIndex("idx_404_log_path").ifNotExists().on("_emdash_404_log").column("path").execute();
|
|
@@ -1525,8 +1526,8 @@ async function down$4(db) {
|
|
|
1525
1526
|
//#endregion
|
|
1526
1527
|
//#region src/database/migrations/036_i18n_menus_and_taxonomies.ts
|
|
1527
1528
|
var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
|
|
1528
|
-
down: () => down$
|
|
1529
|
-
up: () => up$
|
|
1529
|
+
down: () => down$4,
|
|
1530
|
+
up: () => up$4
|
|
1530
1531
|
});
|
|
1531
1532
|
/**
|
|
1532
1533
|
* i18n for menus + taxonomies. Adds `locale` + `translation_group` to system
|
|
@@ -1534,11 +1535,11 @@ var _036_i18n_menus_and_taxonomies_exports = /* @__PURE__ */ __exportAll({
|
|
|
1534
1535
|
* `_emdash_menu_items.reference_id` and `content_taxonomies.taxonomy_id`.
|
|
1535
1536
|
* Backfill locale and column DEFAULTs use the site's configured defaultLocale.
|
|
1536
1537
|
*/
|
|
1537
|
-
function getDefaultLocale() {
|
|
1538
|
+
function getDefaultLocale$1() {
|
|
1538
1539
|
return getI18nConfig()?.defaultLocale ?? "en";
|
|
1539
1540
|
}
|
|
1540
|
-
async function up$
|
|
1541
|
-
const defaultLocale = getDefaultLocale();
|
|
1541
|
+
async function up$4(db) {
|
|
1542
|
+
const defaultLocale = getDefaultLocale$1();
|
|
1542
1543
|
if (isSqlite(db)) {
|
|
1543
1544
|
await rebuildContentTaxonomies(db);
|
|
1544
1545
|
await rebuildMenuItems(db, defaultLocale);
|
|
@@ -1560,7 +1561,7 @@ async function up$3(db) {
|
|
|
1560
1561
|
await remapMenuItemRefs(db);
|
|
1561
1562
|
}
|
|
1562
1563
|
async function rebuildMenus(db, defaultLocale) {
|
|
1563
|
-
if (await hasColumn(db, "_emdash_menus", "locale")) return;
|
|
1564
|
+
if (await hasColumn$1(db, "_emdash_menus", "locale")) return;
|
|
1564
1565
|
await sql.raw(`DROP TABLE IF EXISTS "_emdash_menus_new"`).execute(db);
|
|
1565
1566
|
await db.schema.createTable("_emdash_menus_new").addColumn("id", "text", (c) => c.primaryKey()).addColumn("name", "text", (c) => c.notNull()).addColumn("label", "text", (c) => c.notNull()).addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("locale", "text", (c) => c.notNull().defaultTo(defaultLocale)).addColumn("translation_group", "text").addUniqueConstraint("_emdash_menus_name_locale_unique", ["name", "locale"]).execute();
|
|
1566
1567
|
await sql`
|
|
@@ -1573,7 +1574,7 @@ async function rebuildMenus(db, defaultLocale) {
|
|
|
1573
1574
|
await db.schema.createIndex("idx__emdash_menus_translation_group").on("_emdash_menus").column("translation_group").execute();
|
|
1574
1575
|
}
|
|
1575
1576
|
async function rebuildMenuItems(db, defaultLocale) {
|
|
1576
|
-
if (await hasColumn(db, "_emdash_menu_items", "locale")) return;
|
|
1577
|
+
if (await hasColumn$1(db, "_emdash_menu_items", "locale")) return;
|
|
1577
1578
|
await sql.raw(`DROP TABLE IF EXISTS "_emdash_menu_items_new"`).execute(db);
|
|
1578
1579
|
await db.schema.createTable("_emdash_menu_items_new").addColumn("id", "text", (c) => c.primaryKey()).addColumn("menu_id", "text", (c) => c.notNull()).addColumn("parent_id", "text").addColumn("sort_order", "integer", (c) => c.notNull().defaultTo(0)).addColumn("type", "text", (c) => c.notNull()).addColumn("reference_collection", "text").addColumn("reference_id", "text").addColumn("custom_url", "text").addColumn("label", "text", (c) => c.notNull()).addColumn("title_attr", "text").addColumn("target", "text").addColumn("css_classes", "text").addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("locale", "text", (c) => c.notNull().defaultTo(defaultLocale)).addColumn("translation_group", "text").execute();
|
|
1579
1580
|
await sql`
|
|
@@ -1596,7 +1597,7 @@ async function rebuildMenuItems(db, defaultLocale) {
|
|
|
1596
1597
|
await db.schema.createIndex("idx__emdash_menu_items_translation_group").on("_emdash_menu_items").column("translation_group").execute();
|
|
1597
1598
|
}
|
|
1598
1599
|
async function rebuildTaxonomies(db, defaultLocale) {
|
|
1599
|
-
if (await hasColumn(db, "taxonomies", "locale")) return;
|
|
1600
|
+
if (await hasColumn$1(db, "taxonomies", "locale")) return;
|
|
1600
1601
|
await sql.raw(`DROP TABLE IF EXISTS "taxonomies_new"`).execute(db);
|
|
1601
1602
|
await sql`DROP INDEX IF EXISTS idx_taxonomies_name`.execute(db);
|
|
1602
1603
|
await db.schema.createTable("taxonomies_new").addColumn("id", "text", (c) => c.primaryKey()).addColumn("name", "text", (c) => c.notNull()).addColumn("slug", "text", (c) => c.notNull()).addColumn("label", "text", (c) => c.notNull()).addColumn("parent_id", "text").addColumn("data", "text").addColumn("locale", "text", (c) => c.notNull().defaultTo(defaultLocale)).addColumn("translation_group", "text").addUniqueConstraint("taxonomies_name_slug_locale_unique", [
|
|
@@ -1615,7 +1616,7 @@ async function rebuildTaxonomies(db, defaultLocale) {
|
|
|
1615
1616
|
await db.schema.createIndex("idx_taxonomies_translation_group").on("taxonomies").column("translation_group").execute();
|
|
1616
1617
|
}
|
|
1617
1618
|
async function rebuildTaxonomyDefs(db, defaultLocale) {
|
|
1618
|
-
if (await hasColumn(db, "_emdash_taxonomy_defs", "locale")) return;
|
|
1619
|
+
if (await hasColumn$1(db, "_emdash_taxonomy_defs", "locale")) return;
|
|
1619
1620
|
await sql.raw(`DROP TABLE IF EXISTS "_emdash_taxonomy_defs_new"`).execute(db);
|
|
1620
1621
|
await db.schema.createTable("_emdash_taxonomy_defs_new").addColumn("id", "text", (c) => c.primaryKey()).addColumn("name", "text", (c) => c.notNull()).addColumn("label", "text", (c) => c.notNull()).addColumn("label_singular", "text").addColumn("hierarchical", "integer", (c) => c.defaultTo(0)).addColumn("collections", "text").addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("locale", "text", (c) => c.notNull().defaultTo(defaultLocale)).addColumn("translation_group", "text").addUniqueConstraint("_emdash_taxonomy_defs_name_locale_unique", ["name", "locale"]).execute();
|
|
1621
1622
|
await sql`
|
|
@@ -1706,7 +1707,7 @@ async function pgRemapContentTaxonomies(db) {
|
|
|
1706
1707
|
FROM taxonomies t WHERE t.id = content_taxonomies.taxonomy_id
|
|
1707
1708
|
`.execute(db);
|
|
1708
1709
|
}
|
|
1709
|
-
async function hasColumn(db, table, column) {
|
|
1710
|
+
async function hasColumn$1(db, table, column) {
|
|
1710
1711
|
return (await sql`PRAGMA table_info(${sql.ref(table)})`.execute(db)).rows.some((r) => r.name === column);
|
|
1711
1712
|
}
|
|
1712
1713
|
const SYSTEM_IDENT = /^[_a-z][a-z0-9_]*$/;
|
|
@@ -1735,7 +1736,7 @@ async function assertContentTaxonomiesResolve(db, defaultLocale) {
|
|
|
1735
1736
|
* translated rows onto an ambiguous unique key). Refuse to run when any row
|
|
1736
1737
|
* sits at a locale other than the configured defaultLocale.
|
|
1737
1738
|
*/
|
|
1738
|
-
async function assertSingleLocale(db, defaultLocale) {
|
|
1739
|
+
async function assertSingleLocale$1(db, defaultLocale) {
|
|
1739
1740
|
for (const table of [
|
|
1740
1741
|
"_emdash_menus",
|
|
1741
1742
|
"_emdash_menu_items",
|
|
@@ -1750,9 +1751,9 @@ async function assertSingleLocale(db, defaultLocale) {
|
|
|
1750
1751
|
if (count > 0) throw new Error(`Cannot revert migration 036_i18n_menus_and_taxonomies: ${count} row(s) in "${table}" use a non-default locale (defaultLocale="${defaultLocale}"). Reverting would drop them silently. Export translations first (or delete them) and re-run the rollback. See packages/core/src/database/migrations/036_i18n_menus_and_taxonomies.ts.`);
|
|
1751
1752
|
}
|
|
1752
1753
|
}
|
|
1753
|
-
async function down$
|
|
1754
|
-
const defaultLocale = getDefaultLocale();
|
|
1755
|
-
await assertSingleLocale(db, defaultLocale);
|
|
1754
|
+
async function down$4(db) {
|
|
1755
|
+
const defaultLocale = getDefaultLocale$1();
|
|
1756
|
+
await assertSingleLocale$1(db, defaultLocale);
|
|
1756
1757
|
await assertContentTaxonomiesResolve(db, defaultLocale);
|
|
1757
1758
|
const widenedTables = [
|
|
1758
1759
|
"_emdash_menus",
|
|
@@ -1847,21 +1848,21 @@ async function rebuildTaxonomyDefsDown(db) {
|
|
|
1847
1848
|
//#endregion
|
|
1848
1849
|
//#region src/database/migrations/037_credential_algorithm.ts
|
|
1849
1850
|
var _037_credential_algorithm_exports = /* @__PURE__ */ __exportAll({
|
|
1850
|
-
down: () => down$
|
|
1851
|
-
up: () => up$
|
|
1851
|
+
down: () => down$3,
|
|
1852
|
+
up: () => up$3
|
|
1852
1853
|
});
|
|
1853
|
-
async function up$
|
|
1854
|
+
async function up$3(db) {
|
|
1854
1855
|
if (!await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").addColumn("algorithm", "integer", (col) => col.notNull().defaultTo(-7)).execute();
|
|
1855
1856
|
}
|
|
1856
|
-
async function down$
|
|
1857
|
+
async function down$3(db) {
|
|
1857
1858
|
if (await columnExists(db, "credentials", "algorithm")) await db.schema.alterTable("credentials").dropColumn("algorithm").execute();
|
|
1858
1859
|
}
|
|
1859
1860
|
|
|
1860
1861
|
//#endregion
|
|
1861
1862
|
//#region src/database/migrations/038_registry_plugin_state.ts
|
|
1862
1863
|
var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
|
|
1863
|
-
down: () => down$
|
|
1864
|
-
up: () => up$
|
|
1864
|
+
down: () => down$2,
|
|
1865
|
+
up: () => up$2
|
|
1865
1866
|
});
|
|
1866
1867
|
/**
|
|
1867
1868
|
* Migration: Add registry fields to _plugin_state
|
|
@@ -1889,7 +1890,7 @@ var _038_registry_plugin_state_exports = /* @__PURE__ */ __exportAll({
|
|
|
1889
1890
|
* checks before adding to keep the migration safe under partial
|
|
1890
1891
|
* re-application. The same pattern is used in 019_i18n.ts.
|
|
1891
1892
|
*/
|
|
1892
|
-
async function up$
|
|
1893
|
+
async function up$2(db) {
|
|
1893
1894
|
if (isSqlite(db)) await upSqlite(db);
|
|
1894
1895
|
else await upPostgres(db);
|
|
1895
1896
|
}
|
|
@@ -1932,7 +1933,7 @@ async function upPostgres(db) {
|
|
|
1932
1933
|
WHERE source = 'registry'
|
|
1933
1934
|
`.execute(db);
|
|
1934
1935
|
}
|
|
1935
|
-
async function down$
|
|
1936
|
+
async function down$2(db) {
|
|
1936
1937
|
await sql`
|
|
1937
1938
|
DROP INDEX IF EXISTS idx_plugin_state_registry
|
|
1938
1939
|
`.execute(db);
|
|
@@ -1949,10 +1950,10 @@ async function down$1(db) {
|
|
|
1949
1950
|
//#endregion
|
|
1950
1951
|
//#region src/database/migrations/039_fix_fts5_triggers.ts
|
|
1951
1952
|
var _039_fix_fts5_triggers_exports = /* @__PURE__ */ __exportAll({
|
|
1952
|
-
down: () => down,
|
|
1953
|
-
up: () => up
|
|
1953
|
+
down: () => down$1,
|
|
1954
|
+
up: () => up$1
|
|
1954
1955
|
});
|
|
1955
|
-
async function up(db) {
|
|
1956
|
+
async function up$1(db) {
|
|
1956
1957
|
if (!isSqlite(db)) return;
|
|
1957
1958
|
const collections = await sql`
|
|
1958
1959
|
SELECT slug, search_config FROM _emdash_collections
|
|
@@ -1986,7 +1987,7 @@ async function up(db) {
|
|
|
1986
1987
|
* at runtime, not by this migration, so leaving them in their
|
|
1987
1988
|
* corruption-safe state on rollback is correct.
|
|
1988
1989
|
*/
|
|
1989
|
-
async function down(_db) {}
|
|
1990
|
+
async function down$1(_db) {}
|
|
1990
1991
|
function isSearchEnabled(searchConfig) {
|
|
1991
1992
|
if (!searchConfig) return false;
|
|
1992
1993
|
try {
|
|
@@ -2075,6 +2076,311 @@ async function dropFtsObjects(db, collectionSlug) {
|
|
|
2075
2076
|
await sql.raw(`DROP TABLE IF EXISTS "${ftsTable}"`).execute(db);
|
|
2076
2077
|
}
|
|
2077
2078
|
|
|
2079
|
+
//#endregion
|
|
2080
|
+
//#region src/database/migrations/040_byline_i18n.ts
|
|
2081
|
+
var _040_byline_i18n_exports = /* @__PURE__ */ __exportAll({
|
|
2082
|
+
down: () => down,
|
|
2083
|
+
up: () => up
|
|
2084
|
+
});
|
|
2085
|
+
/**
|
|
2086
|
+
* i18n for bylines. Adds `locale` + `translation_group` to `_emdash_bylines`
|
|
2087
|
+
* and stores translation_groups (not row ids) in
|
|
2088
|
+
* `_emdash_content_bylines.byline_id` and `ec_*.primary_byline_id`. Backfill
|
|
2089
|
+
* locale and column DEFAULTs use the site's configured defaultLocale.
|
|
2090
|
+
*
|
|
2091
|
+
* Mirrors the row-per-locale + `translation_group` model PR #916 (migration
|
|
2092
|
+
* 036) applied to menus and taxonomies.
|
|
2093
|
+
*
|
|
2094
|
+
* Key consequences of the model:
|
|
2095
|
+
* - `(slug, locale)` is unique on `_emdash_bylines`; a single slug can repeat
|
|
2096
|
+
* across locales (one row per locale variant of a byline).
|
|
2097
|
+
* - The partial unique on `user_id` widens to `(user_id, locale)` so a CMS
|
|
2098
|
+
* user can have one byline per locale.
|
|
2099
|
+
* - `_emdash_content_bylines.byline_id` no longer FKs to `_emdash_bylines.id`
|
|
2100
|
+
* (it holds a `translation_group`, not a row id). The runtime is
|
|
2101
|
+
* responsible for cascading on byline delete — see `BylineRepository.delete`.
|
|
2102
|
+
*
|
|
2103
|
+
* Hydration is strict per locale (see `BylineRepository.getContentBylines`):
|
|
2104
|
+
* a credit at locale X renders iff a byline row exists at locale X within the
|
|
2105
|
+
* credited translation group. This mirrors `getEntryTerms` and the convention
|
|
2106
|
+
* established by #916. There is no read-time fallback.
|
|
2107
|
+
*/
|
|
2108
|
+
function getDefaultLocale() {
|
|
2109
|
+
return getI18nConfig()?.defaultLocale ?? "en";
|
|
2110
|
+
}
|
|
2111
|
+
async function up(db) {
|
|
2112
|
+
const defaultLocale = getDefaultLocale();
|
|
2113
|
+
if (isSqlite(db)) {
|
|
2114
|
+
await rebuildContentBylines(db);
|
|
2115
|
+
await rebuildBylines(db, defaultLocale);
|
|
2116
|
+
await remapPrimaryBylineIds(db);
|
|
2117
|
+
return;
|
|
2118
|
+
}
|
|
2119
|
+
await pgWidenBylines(db, defaultLocale);
|
|
2120
|
+
await pgDropContentBylinesFk(db);
|
|
2121
|
+
await remapPrimaryBylineIds(db);
|
|
2122
|
+
}
|
|
2123
|
+
async function rebuildContentBylines(db) {
|
|
2124
|
+
if ((await sql`PRAGMA foreign_key_list(_emdash_content_bylines)`.execute(db)).rows.length === 0) return;
|
|
2125
|
+
await sql.raw(`DROP TABLE IF EXISTS "_emdash_content_bylines_new"`).execute(db);
|
|
2126
|
+
await db.schema.createTable("_emdash_content_bylines_new").addColumn("id", "text", (c) => c.primaryKey()).addColumn("collection_slug", "text", (c) => c.notNull()).addColumn("content_id", "text", (c) => c.notNull()).addColumn("byline_id", "text", (c) => c.notNull()).addColumn("sort_order", "integer", (c) => c.notNull().defaultTo(0)).addColumn("role_label", "text").addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addUniqueConstraint("content_bylines_unique", [
|
|
2127
|
+
"collection_slug",
|
|
2128
|
+
"content_id",
|
|
2129
|
+
"byline_id"
|
|
2130
|
+
]).execute();
|
|
2131
|
+
await sql`
|
|
2132
|
+
INSERT INTO _emdash_content_bylines_new
|
|
2133
|
+
(id, collection_slug, content_id, byline_id, sort_order, role_label, created_at)
|
|
2134
|
+
SELECT id, collection_slug, content_id, byline_id, sort_order, role_label, created_at
|
|
2135
|
+
FROM _emdash_content_bylines
|
|
2136
|
+
`.execute(db);
|
|
2137
|
+
await db.schema.dropTable("_emdash_content_bylines").execute();
|
|
2138
|
+
await sql`ALTER TABLE _emdash_content_bylines_new RENAME TO _emdash_content_bylines`.execute(db);
|
|
2139
|
+
await db.schema.createIndex("idx_content_bylines_content").on("_emdash_content_bylines").columns([
|
|
2140
|
+
"collection_slug",
|
|
2141
|
+
"content_id",
|
|
2142
|
+
"sort_order"
|
|
2143
|
+
]).execute();
|
|
2144
|
+
await db.schema.createIndex("idx_content_bylines_byline").on("_emdash_content_bylines").column("byline_id").execute();
|
|
2145
|
+
}
|
|
2146
|
+
async function rebuildBylines(db, defaultLocale) {
|
|
2147
|
+
if (await hasColumn(db, "_emdash_bylines", "locale")) return;
|
|
2148
|
+
await sql.raw(`DROP TABLE IF EXISTS "_emdash_bylines_new"`).execute(db);
|
|
2149
|
+
await db.schema.createTable("_emdash_bylines_new").addColumn("id", "text", (c) => c.primaryKey()).addColumn("slug", "text", (c) => c.notNull()).addColumn("display_name", "text", (c) => c.notNull()).addColumn("bio", "text").addColumn("avatar_media_id", "text", (c) => c.references("media.id").onDelete("set null")).addColumn("website_url", "text").addColumn("user_id", "text", (c) => c.references("users.id").onDelete("set null")).addColumn("is_guest", "integer", (c) => c.notNull().defaultTo(0)).addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("locale", "text", (c) => c.notNull().defaultTo(defaultLocale)).addColumn("translation_group", "text").addUniqueConstraint("_emdash_bylines_slug_locale_unique", ["slug", "locale"]).execute();
|
|
2150
|
+
await sql`
|
|
2151
|
+
INSERT INTO _emdash_bylines_new (
|
|
2152
|
+
id, slug, display_name, bio, avatar_media_id, website_url,
|
|
2153
|
+
user_id, is_guest, created_at, updated_at, locale, translation_group
|
|
2154
|
+
)
|
|
2155
|
+
SELECT
|
|
2156
|
+
id, slug, display_name, bio, avatar_media_id, website_url,
|
|
2157
|
+
user_id, is_guest, created_at, updated_at, ${defaultLocale}, id
|
|
2158
|
+
FROM _emdash_bylines
|
|
2159
|
+
`.execute(db);
|
|
2160
|
+
await db.schema.dropTable("_emdash_bylines").execute();
|
|
2161
|
+
await sql`ALTER TABLE _emdash_bylines_new RENAME TO _emdash_bylines`.execute(db);
|
|
2162
|
+
await db.schema.createIndex("idx_bylines_slug").on("_emdash_bylines").column("slug").execute();
|
|
2163
|
+
await db.schema.createIndex("idx_bylines_display_name").on("_emdash_bylines").column("display_name").execute();
|
|
2164
|
+
await sql`
|
|
2165
|
+
CREATE UNIQUE INDEX ${sql.ref("idx_bylines_user_id_locale_unique")}
|
|
2166
|
+
ON ${sql.ref("_emdash_bylines")} (user_id, locale)
|
|
2167
|
+
WHERE user_id IS NOT NULL
|
|
2168
|
+
`.execute(db);
|
|
2169
|
+
await db.schema.createIndex("idx__emdash_bylines_locale").on("_emdash_bylines").column("locale").execute();
|
|
2170
|
+
await db.schema.createIndex("idx__emdash_bylines_translation_group").on("_emdash_bylines").column("translation_group").execute();
|
|
2171
|
+
await sql`
|
|
2172
|
+
CREATE UNIQUE INDEX ${sql.ref("idx_bylines_group_locale_unique")}
|
|
2173
|
+
ON ${sql.ref("_emdash_bylines")} (translation_group, locale)
|
|
2174
|
+
WHERE translation_group IS NOT NULL
|
|
2175
|
+
`.execute(db);
|
|
2176
|
+
}
|
|
2177
|
+
async function remapPrimaryBylineIds(db) {
|
|
2178
|
+
const collections = await listTablesLike(db, "ec_%");
|
|
2179
|
+
for (const table of collections) {
|
|
2180
|
+
validateIdentifier(table, "content table");
|
|
2181
|
+
await sql`
|
|
2182
|
+
UPDATE ${sql.ref(table)} SET primary_byline_id = (
|
|
2183
|
+
SELECT translation_group FROM _emdash_bylines
|
|
2184
|
+
WHERE _emdash_bylines.id = ${sql.ref(table)}.primary_byline_id
|
|
2185
|
+
)
|
|
2186
|
+
WHERE primary_byline_id IS NOT NULL
|
|
2187
|
+
AND EXISTS (
|
|
2188
|
+
SELECT 1 FROM _emdash_bylines
|
|
2189
|
+
WHERE _emdash_bylines.id = ${sql.ref(table)}.primary_byline_id
|
|
2190
|
+
)
|
|
2191
|
+
`.execute(db);
|
|
2192
|
+
}
|
|
2193
|
+
}
|
|
2194
|
+
async function pgWidenBylines(db, defaultLocale) {
|
|
2195
|
+
const ref = sql.ref("_emdash_bylines");
|
|
2196
|
+
await sql`ALTER TABLE ${ref} ADD COLUMN IF NOT EXISTS locale TEXT NOT NULL DEFAULT ${sql.lit(defaultLocale)}`.execute(db);
|
|
2197
|
+
await sql`ALTER TABLE ${ref} ADD COLUMN IF NOT EXISTS translation_group TEXT`.execute(db);
|
|
2198
|
+
await sql`UPDATE ${ref} SET translation_group = id WHERE translation_group IS NULL`.execute(db);
|
|
2199
|
+
await sql`CREATE INDEX IF NOT EXISTS ${sql.ref("idx__emdash_bylines_locale")} ON ${ref} (locale)`.execute(db);
|
|
2200
|
+
await sql`
|
|
2201
|
+
CREATE INDEX IF NOT EXISTS ${sql.ref("idx__emdash_bylines_translation_group")}
|
|
2202
|
+
ON ${ref} (translation_group)
|
|
2203
|
+
`.execute(db);
|
|
2204
|
+
const slugCons = await sql`
|
|
2205
|
+
SELECT conname FROM pg_constraint c
|
|
2206
|
+
WHERE c.conrelid = '_emdash_bylines'::regclass AND c.contype = 'u'
|
|
2207
|
+
AND array_length(c.conkey, 1) = 1
|
|
2208
|
+
AND (
|
|
2209
|
+
SELECT array_agg(a.attname ORDER BY pos.ord)
|
|
2210
|
+
FROM unnest(c.conkey) WITH ORDINALITY AS pos(attnum, ord)
|
|
2211
|
+
JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = pos.attnum
|
|
2212
|
+
)::text[] = ARRAY['slug']
|
|
2213
|
+
`.execute(db);
|
|
2214
|
+
for (const c of slugCons.rows) await sql`ALTER TABLE ${ref} DROP CONSTRAINT ${sql.ref(c.conname)}`.execute(db);
|
|
2215
|
+
await sql`
|
|
2216
|
+
ALTER TABLE ${ref}
|
|
2217
|
+
ADD CONSTRAINT _emdash_bylines_slug_locale_unique UNIQUE (slug, locale)
|
|
2218
|
+
`.execute(db);
|
|
2219
|
+
await sql`DROP INDEX IF EXISTS idx_bylines_user_id_unique`.execute(db);
|
|
2220
|
+
await sql`
|
|
2221
|
+
CREATE UNIQUE INDEX IF NOT EXISTS ${sql.ref("idx_bylines_user_id_locale_unique")}
|
|
2222
|
+
ON ${ref} (user_id, locale) WHERE user_id IS NOT NULL
|
|
2223
|
+
`.execute(db);
|
|
2224
|
+
await sql`
|
|
2225
|
+
CREATE UNIQUE INDEX IF NOT EXISTS ${sql.ref("idx_bylines_group_locale_unique")}
|
|
2226
|
+
ON ${ref} (translation_group, locale) WHERE translation_group IS NOT NULL
|
|
2227
|
+
`.execute(db);
|
|
2228
|
+
}
|
|
2229
|
+
async function pgDropContentBylinesFk(db) {
|
|
2230
|
+
const fks = await sql`
|
|
2231
|
+
SELECT conname FROM pg_constraint
|
|
2232
|
+
WHERE conrelid = '_emdash_content_bylines'::regclass AND contype = 'f'
|
|
2233
|
+
`.execute(db);
|
|
2234
|
+
for (const c of fks.rows) await sql`ALTER TABLE _emdash_content_bylines DROP CONSTRAINT ${sql.ref(c.conname)}`.execute(db);
|
|
2235
|
+
}
|
|
2236
|
+
async function hasColumn(db, table, column) {
|
|
2237
|
+
return (await sql`PRAGMA table_info(${sql.ref(table)})`.execute(db)).rows.some((r) => r.name === column);
|
|
2238
|
+
}
|
|
2239
|
+
/**
|
|
2240
|
+
* down() restores the FK on `_emdash_content_bylines.byline_id`. Rows whose
|
|
2241
|
+
* `byline_id` doesn't resolve to a (translation_group, defaultLocale) row in
|
|
2242
|
+
* `_emdash_bylines` would fail the rebuild after other tables are already
|
|
2243
|
+
* stripped — leaving the user mid-rollback. Surface dangling rows up front.
|
|
2244
|
+
*/
|
|
2245
|
+
async function assertContentBylinesResolve(db, defaultLocale) {
|
|
2246
|
+
const result = await sql`
|
|
2247
|
+
SELECT COUNT(*) AS count FROM _emdash_content_bylines cb
|
|
2248
|
+
WHERE NOT EXISTS (
|
|
2249
|
+
SELECT 1 FROM _emdash_bylines b
|
|
2250
|
+
WHERE b.translation_group = cb.byline_id AND b.locale = ${defaultLocale}
|
|
2251
|
+
)
|
|
2252
|
+
`.execute(db);
|
|
2253
|
+
const count = Number(result.rows[0]?.count ?? 0);
|
|
2254
|
+
if (count > 0) throw new Error(`Cannot revert migration 040_byline_i18n: ${count} row(s) in "_emdash_content_bylines" reference a translation_group with no row in "_emdash_bylines" at locale="${defaultLocale}". Clean up the dangling credits before rolling back.`);
|
|
2255
|
+
}
|
|
2256
|
+
/**
|
|
2257
|
+
* down() is destructive on multi-locale installs (dropping `locale` collapses
|
|
2258
|
+
* translated rows onto an ambiguous unique key). Refuse to run when any row
|
|
2259
|
+
* sits at a locale other than the configured defaultLocale.
|
|
2260
|
+
*/
|
|
2261
|
+
async function assertSingleLocale(db, defaultLocale) {
|
|
2262
|
+
const result = await sql`
|
|
2263
|
+
SELECT COUNT(*) AS count FROM _emdash_bylines WHERE locale != ${defaultLocale}
|
|
2264
|
+
`.execute(db);
|
|
2265
|
+
const count = Number(result.rows[0]?.count ?? 0);
|
|
2266
|
+
if (count > 0) throw new Error(`Cannot revert migration 040_byline_i18n: ${count} row(s) in "_emdash_bylines" use a non-default locale (defaultLocale="${defaultLocale}"). Reverting would drop them silently. Export translations first (or delete them) and re-run the rollback. See packages/core/src/database/migrations/040_byline_i18n.ts.`);
|
|
2267
|
+
}
|
|
2268
|
+
async function down(db) {
|
|
2269
|
+
const defaultLocale = getDefaultLocale();
|
|
2270
|
+
await assertSingleLocale(db, defaultLocale);
|
|
2271
|
+
await assertContentBylinesResolve(db, defaultLocale);
|
|
2272
|
+
if (isSqlite(db)) {
|
|
2273
|
+
await sql.raw(`DROP INDEX IF EXISTS idx__emdash_bylines_locale`).execute(db);
|
|
2274
|
+
await sql.raw(`DROP INDEX IF EXISTS idx__emdash_bylines_translation_group`).execute(db);
|
|
2275
|
+
await sql.raw(`DROP INDEX IF EXISTS idx_bylines_user_id_locale_unique`).execute(db);
|
|
2276
|
+
await sql.raw(`DROP INDEX IF EXISTS idx_bylines_group_locale_unique`).execute(db);
|
|
2277
|
+
await remapPrimaryBylineIdsDown(db, defaultLocale);
|
|
2278
|
+
await remapContentBylinesDown(db, defaultLocale);
|
|
2279
|
+
await rebuildBylinesDown(db);
|
|
2280
|
+
await restoreContentBylinesFk(db);
|
|
2281
|
+
return;
|
|
2282
|
+
}
|
|
2283
|
+
await remapPrimaryBylineIdsDown(db, defaultLocale);
|
|
2284
|
+
await sql`
|
|
2285
|
+
UPDATE _emdash_content_bylines
|
|
2286
|
+
SET byline_id = COALESCE(
|
|
2287
|
+
(SELECT b.id FROM _emdash_bylines b
|
|
2288
|
+
WHERE b.translation_group = _emdash_content_bylines.byline_id
|
|
2289
|
+
AND b.locale = ${defaultLocale}),
|
|
2290
|
+
byline_id
|
|
2291
|
+
)
|
|
2292
|
+
`.execute(db);
|
|
2293
|
+
await sql.raw(`DROP INDEX IF EXISTS idx__emdash_bylines_locale`).execute(db);
|
|
2294
|
+
await sql.raw(`DROP INDEX IF EXISTS idx__emdash_bylines_translation_group`).execute(db);
|
|
2295
|
+
await sql.raw(`DROP INDEX IF EXISTS idx_bylines_user_id_locale_unique`).execute(db);
|
|
2296
|
+
await sql.raw(`DROP INDEX IF EXISTS idx_bylines_group_locale_unique`).execute(db);
|
|
2297
|
+
await sql.raw(`ALTER TABLE "_emdash_bylines" DROP CONSTRAINT IF EXISTS _emdash_bylines_slug_locale_unique`).execute(db);
|
|
2298
|
+
await sql.raw(`ALTER TABLE "_emdash_bylines" DROP COLUMN IF EXISTS locale`).execute(db);
|
|
2299
|
+
await sql.raw(`ALTER TABLE "_emdash_bylines" DROP COLUMN IF EXISTS translation_group`).execute(db);
|
|
2300
|
+
await sql.raw(`ALTER TABLE "_emdash_bylines" ADD CONSTRAINT _emdash_bylines_slug_unique UNIQUE (slug)`).execute(db);
|
|
2301
|
+
await sql`
|
|
2302
|
+
CREATE UNIQUE INDEX IF NOT EXISTS ${sql.ref("idx_bylines_user_id_unique")}
|
|
2303
|
+
ON _emdash_bylines (user_id) WHERE user_id IS NOT NULL
|
|
2304
|
+
`.execute(db);
|
|
2305
|
+
await sql`
|
|
2306
|
+
ALTER TABLE _emdash_content_bylines
|
|
2307
|
+
ADD CONSTRAINT _emdash_content_bylines_byline_fk
|
|
2308
|
+
FOREIGN KEY (byline_id) REFERENCES _emdash_bylines(id) ON DELETE CASCADE
|
|
2309
|
+
`.execute(db);
|
|
2310
|
+
}
|
|
2311
|
+
async function remapPrimaryBylineIdsDown(db, defaultLocale) {
|
|
2312
|
+
const collections = await listTablesLike(db, "ec_%");
|
|
2313
|
+
for (const table of collections) {
|
|
2314
|
+
validateIdentifier(table, "content table");
|
|
2315
|
+
await sql`
|
|
2316
|
+
UPDATE ${sql.ref(table)}
|
|
2317
|
+
SET primary_byline_id = COALESCE(
|
|
2318
|
+
(SELECT b.id FROM _emdash_bylines b
|
|
2319
|
+
WHERE b.translation_group = ${sql.ref(table)}.primary_byline_id
|
|
2320
|
+
AND b.locale = ${defaultLocale}),
|
|
2321
|
+
primary_byline_id
|
|
2322
|
+
)
|
|
2323
|
+
WHERE primary_byline_id IS NOT NULL
|
|
2324
|
+
`.execute(db);
|
|
2325
|
+
}
|
|
2326
|
+
}
|
|
2327
|
+
async function remapContentBylinesDown(db, defaultLocale) {
|
|
2328
|
+
await sql`
|
|
2329
|
+
UPDATE _emdash_content_bylines
|
|
2330
|
+
SET byline_id = COALESCE(
|
|
2331
|
+
(SELECT b.id FROM _emdash_bylines b
|
|
2332
|
+
WHERE b.translation_group = _emdash_content_bylines.byline_id
|
|
2333
|
+
AND b.locale = ${defaultLocale}),
|
|
2334
|
+
byline_id
|
|
2335
|
+
)
|
|
2336
|
+
`.execute(db);
|
|
2337
|
+
}
|
|
2338
|
+
async function rebuildBylinesDown(db) {
|
|
2339
|
+
await sql.raw(`DROP TABLE IF EXISTS "_emdash_bylines_old"`).execute(db);
|
|
2340
|
+
await db.schema.createTable("_emdash_bylines_old").addColumn("id", "text", (c) => c.primaryKey()).addColumn("slug", "text", (c) => c.notNull().unique()).addColumn("display_name", "text", (c) => c.notNull()).addColumn("bio", "text").addColumn("avatar_media_id", "text", (c) => c.references("media.id").onDelete("set null")).addColumn("website_url", "text").addColumn("user_id", "text", (c) => c.references("users.id").onDelete("set null")).addColumn("is_guest", "integer", (c) => c.notNull().defaultTo(0)).addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addColumn("updated_at", "text", (c) => c.defaultTo(currentTimestamp(db))).execute();
|
|
2341
|
+
await sql`
|
|
2342
|
+
INSERT INTO _emdash_bylines_old (
|
|
2343
|
+
id, slug, display_name, bio, avatar_media_id, website_url,
|
|
2344
|
+
user_id, is_guest, created_at, updated_at
|
|
2345
|
+
)
|
|
2346
|
+
SELECT
|
|
2347
|
+
id, slug, display_name, bio, avatar_media_id, website_url,
|
|
2348
|
+
user_id, is_guest, created_at, updated_at
|
|
2349
|
+
FROM _emdash_bylines
|
|
2350
|
+
`.execute(db);
|
|
2351
|
+
await db.schema.dropTable("_emdash_bylines").execute();
|
|
2352
|
+
await sql`ALTER TABLE _emdash_bylines_old RENAME TO _emdash_bylines`.execute(db);
|
|
2353
|
+
await db.schema.createIndex("idx_bylines_slug").on("_emdash_bylines").column("slug").execute();
|
|
2354
|
+
await db.schema.createIndex("idx_bylines_display_name").on("_emdash_bylines").column("display_name").execute();
|
|
2355
|
+
await sql`
|
|
2356
|
+
CREATE UNIQUE INDEX ${sql.ref("idx_bylines_user_id_unique")}
|
|
2357
|
+
ON ${sql.ref("_emdash_bylines")} (user_id)
|
|
2358
|
+
WHERE user_id IS NOT NULL
|
|
2359
|
+
`.execute(db);
|
|
2360
|
+
}
|
|
2361
|
+
async function restoreContentBylinesFk(db) {
|
|
2362
|
+
await sql.raw(`DROP TABLE IF EXISTS "_emdash_content_bylines_old"`).execute(db);
|
|
2363
|
+
await db.schema.createTable("_emdash_content_bylines_old").addColumn("id", "text", (c) => c.primaryKey()).addColumn("collection_slug", "text", (c) => c.notNull()).addColumn("content_id", "text", (c) => c.notNull()).addColumn("byline_id", "text", (c) => c.notNull().references("_emdash_bylines.id").onDelete("cascade")).addColumn("sort_order", "integer", (c) => c.notNull().defaultTo(0)).addColumn("role_label", "text").addColumn("created_at", "text", (c) => c.defaultTo(currentTimestamp(db))).addUniqueConstraint("content_bylines_unique", [
|
|
2364
|
+
"collection_slug",
|
|
2365
|
+
"content_id",
|
|
2366
|
+
"byline_id"
|
|
2367
|
+
]).execute();
|
|
2368
|
+
await sql`
|
|
2369
|
+
INSERT INTO _emdash_content_bylines_old
|
|
2370
|
+
(id, collection_slug, content_id, byline_id, sort_order, role_label, created_at)
|
|
2371
|
+
SELECT id, collection_slug, content_id, byline_id, sort_order, role_label, created_at
|
|
2372
|
+
FROM _emdash_content_bylines
|
|
2373
|
+
`.execute(db);
|
|
2374
|
+
await db.schema.dropTable("_emdash_content_bylines").execute();
|
|
2375
|
+
await sql`ALTER TABLE _emdash_content_bylines_old RENAME TO _emdash_content_bylines`.execute(db);
|
|
2376
|
+
await db.schema.createIndex("idx_content_bylines_content").on("_emdash_content_bylines").columns([
|
|
2377
|
+
"collection_slug",
|
|
2378
|
+
"content_id",
|
|
2379
|
+
"sort_order"
|
|
2380
|
+
]).execute();
|
|
2381
|
+
await db.schema.createIndex("idx_content_bylines_byline").on("_emdash_content_bylines").column("byline_id").execute();
|
|
2382
|
+
}
|
|
2383
|
+
|
|
2078
2384
|
//#endregion
|
|
2079
2385
|
//#region src/database/migrations/runner.ts
|
|
2080
2386
|
const MIGRATIONS = Object.freeze({
|
|
@@ -2115,7 +2421,8 @@ const MIGRATIONS = Object.freeze({
|
|
|
2115
2421
|
"036_i18n_menus_and_taxonomies": _036_i18n_menus_and_taxonomies_exports,
|
|
2116
2422
|
"037_credential_algorithm": _037_credential_algorithm_exports,
|
|
2117
2423
|
"038_registry_plugin_state": _038_registry_plugin_state_exports,
|
|
2118
|
-
"039_fix_fts5_triggers": _039_fix_fts5_triggers_exports
|
|
2424
|
+
"039_fix_fts5_triggers": _039_fix_fts5_triggers_exports,
|
|
2425
|
+
"040_byline_i18n": _040_byline_i18n_exports
|
|
2119
2426
|
});
|
|
2120
2427
|
/** Total number of registered migrations. Exported for use in tests. */
|
|
2121
2428
|
const MIGRATION_COUNT = Object.keys(MIGRATIONS).length;
|
|
@@ -2312,4 +2619,4 @@ async function rollbackMigration(db) {
|
|
|
2312
2619
|
|
|
2313
2620
|
//#endregion
|
|
2314
2621
|
export { __exportAll as i, rollbackMigration as n, runMigrations as r, getMigrationStatus as t };
|
|
2315
|
-
//# sourceMappingURL=runner-
|
|
2622
|
+
//# sourceMappingURL=runner-CGlojznK.mjs.map
|