emdash 0.40.1 → 0.41.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/action-token-CbKDcPJi.mjs +26 -0
- package/dist/action-token-CbKDcPJi.mjs.map +1 -0
- package/dist/activation-PtniBLt9.mjs +382 -0
- package/dist/activation-PtniBLt9.mjs.map +1 -0
- package/dist/adapters-C_Tf5x90.d.mts +171 -0
- package/dist/adapters-C_Tf5x90.d.mts.map +1 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs +116 -0
- package/dist/allowed-origins-U1z4TdEZ.mjs.map +1 -0
- package/dist/api/route-utils.d.mts +4 -4
- package/dist/api/route-utils.mjs +46 -45
- package/dist/api/route-utils.mjs.map +1 -1
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +10 -10
- package/dist/api-CXwQkV_m.mjs +5122 -0
- package/dist/api-CXwQkV_m.mjs.map +1 -0
- package/dist/api-tokens-89WlohEN.mjs +166 -0
- package/dist/api-tokens-89WlohEN.mjs.map +1 -0
- package/dist/apply-Do3KNnUk.mjs +1659 -0
- package/dist/apply-Do3KNnUk.mjs.map +1 -0
- package/dist/approvals-CAX9Yw33.mjs +460 -0
- package/dist/approvals-CAX9Yw33.mjs.map +1 -0
- package/dist/artifact-fetch-B9W4CEST.mjs +659 -0
- package/dist/artifact-fetch-B9W4CEST.mjs.map +1 -0
- package/dist/astro/index.d.mts +14 -14
- package/dist/astro/index.mjs +20 -24
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +12 -12
- package/dist/astro/middleware/auth.mjs +10 -10
- package/dist/astro/middleware/media-usage-write-fence.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +7 -7
- package/dist/astro/middleware/request-context.mjs +3 -3
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +12 -12
- package/dist/astro/middleware.mjs +109 -106
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +14 -14
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +14 -14
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +7 -7
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +17 -17
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +17 -17
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +23 -23
- package/dist/astro/routes/api/admin/bylines/index.mjs +23 -23
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +18 -18
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +17 -17
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +17 -17
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +6 -6
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +5 -5
- package/dist/astro/routes/api/admin/media-usage/activation.mjs +20 -20
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/collection-deletions/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/progress.mjs +25 -25
- package/dist/astro/routes/api/admin/media-usage/repair.mjs +31 -31
- package/dist/astro/routes/api/admin/media-usage/work/index.mjs +22 -22
- package/dist/astro/routes/api/admin/media-usage/work/retry.mjs +22 -22
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +8 -8
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/mcp.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/_id_/settings.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +82 -78
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/index.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +5 -5
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -67
- 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 +81 -77
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/_id_/uninstall.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs +83 -79
- package/dist/astro/routes/api/admin/plugins/registry/_id_/update.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/artifact.mjs +9 -9
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs +74 -70
- package/dist/astro/routes/api/admin/plugins/registry/install.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/registry/publisher-handle.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs +72 -68
- package/dist/astro/routes/api/admin/plugins/registry/verify.mjs.map +1 -1
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -67
- package/dist/astro/routes/api/admin/plugins/updates.mjs.map +1 -1
- package/dist/astro/routes/api/admin/scheduled-policy-rejections/_collection_/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -67
- 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 +5 -5
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -67
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs.map +1 -1
- package/dist/astro/routes/api/admin/transfer/_...path_.mjs +4 -4
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/approve.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/_id_/deny.mjs +40 -40
- package/dist/astro/routes/api/admin/transfer/approvals/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/capabilities.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/archive.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/files/_...path_.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/exports/_id_/manifest.mjs +43 -43
- package/dist/astro/routes/api/admin/transfer/exports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/abandon.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/advance.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/analyze.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/cancel.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/execute.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/files/_...path_.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/index.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/missing.mjs +44 -44
- package/dist/astro/routes/api/admin/transfer/imports/_id_/plan.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/_id_/receipt.mjs +42 -42
- package/dist/astro/routes/api/admin/transfer/imports/index.mjs +44 -44
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +5 -5
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +4 -4
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +15 -15
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +6 -6
- package/dist/astro/routes/api/admin/users/index.mjs +14 -14
- package/dist/astro/routes/api/auth/dev-bypass.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/accept.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/invite/index.mjs +16 -16
- package/dist/astro/routes/api/auth/invite/register-options.mjs +17 -17
- package/dist/astro/routes/api/auth/logout.mjs +5 -5
- package/dist/astro/routes/api/auth/magic-link/send.mjs +18 -18
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +14 -14
- package/dist/astro/routes/api/auth/me.mjs +15 -15
- package/dist/astro/routes/api/auth/mode.mjs +5 -5
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +14 -14
- package/dist/astro/routes/api/auth/passkey/index.mjs +4 -4
- package/dist/astro/routes/api/auth/passkey/options.mjs +19 -19
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +17 -17
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/passkey/verify.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/complete.mjs +18 -18
- package/dist/astro/routes/api/auth/signup/request.mjs +17 -17
- package/dist/astro/routes/api/auth/signup/verify.mjs +4 -4
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/lock.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/plugin-extensions/_pluginId_/_kind_/_extensionId_.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +31 -31
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts +1 -2
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs +42 -53
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/children.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs +34 -29
- package/dist/astro/routes/api/content/_collection_/_id_/references/_relation_/parents.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +25 -24
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +17 -17
- package/dist/astro/routes/api/content/_collection_/_id_.d.mts.map +1 -1
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +18 -18
- package/dist/astro/routes/api/content/_collection_/_id_.mjs.map +1 -1
- package/dist/astro/routes/api/content/_collection_/authors.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/index.mjs +15 -15
- package/dist/astro/routes/api/content/_collection_/trash.mjs +15 -15
- package/dist/astro/routes/api/dashboard.mjs +10 -9
- package/dist/astro/routes/api/dashboard.mjs.map +1 -1
- package/dist/astro/routes/api/dev/emails.mjs +5 -5
- package/dist/astro/routes/api/health.mjs +6 -6
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +6 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/execute.mjs +16 -16
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -12
- package/dist/astro/routes/api/import/wordpress/media.mjs +19 -19
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +18 -18
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +28 -28
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +23 -23
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +34 -34
- package/dist/astro/routes/api/manifest.mjs +6 -6
- package/dist/astro/routes/api/mcp.mjs +91 -91
- package/dist/astro/routes/api/media/_id_/confirm.mjs +19 -19
- package/dist/astro/routes/api/media/_id_/replace.mjs +16 -16
- package/dist/astro/routes/api/media/_id_/upload.mjs +9 -9
- package/dist/astro/routes/api/media/_id_/usage.mjs +33 -33
- package/dist/astro/routes/api/media/_id_.mjs +31 -31
- package/dist/astro/routes/api/media/asset/_id_/_filename_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +9 -9
- package/dist/astro/routes/api/media/folders/_id_.mjs +16 -16
- package/dist/astro/routes/api/media/folders/index.mjs +16 -16
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +5 -5
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +5 -5
- package/dist/astro/routes/api/media/providers/index.mjs +5 -5
- package/dist/astro/routes/api/media/upload-url.mjs +18 -18
- package/dist/astro/routes/api/media.mjs +35 -35
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/items.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_/translations.mjs +17 -17
- package/dist/astro/routes/api/menus/_name_.mjs +17 -17
- package/dist/astro/routes/api/menus/index.mjs +17 -17
- package/dist/astro/routes/api/oauth/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/authorize.d.mts +2 -1
- package/dist/astro/routes/api/oauth/device/authorize.d.mts.map +1 -1
- package/dist/astro/routes/api/oauth/device/authorize.mjs +23 -9
- package/dist/astro/routes/api/oauth/device/authorize.mjs.map +1 -1
- package/dist/astro/routes/api/oauth/device/code.mjs +11 -11
- package/dist/astro/routes/api/oauth/device/token.mjs +10 -10
- package/dist/astro/routes/api/oauth/register.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/refresh.mjs +8 -8
- package/dist/astro/routes/api/oauth/token/revoke.mjs +8 -8
- package/dist/astro/routes/api/oauth/token.mjs +8 -8
- package/dist/astro/routes/api/openapi.json.mjs +20 -20
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +11 -11
- package/dist/astro/routes/api/redirects/404s/index.mjs +19 -19
- package/dist/astro/routes/api/redirects/404s/summary.mjs +19 -19
- package/dist/astro/routes/api/redirects/_id_.mjs +19 -19
- package/dist/astro/routes/api/redirects/index.mjs +19 -19
- package/dist/astro/routes/api/relations/_id_/index.mjs +34 -29
- package/dist/astro/routes/api/relations/_id_/index.mjs.map +1 -1
- package/dist/astro/routes/api/relations/index.mjs +36 -31
- package/dist/astro/routes/api/relations/index.mjs.map +1 -1
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +5 -5
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +5 -5
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/_slug_/versions/_version_/activate.mjs.map +1 -1
- package/dist/astro/routes/api/schema/block-types/index.mjs +71 -67
- package/dist/astro/routes/api/schema/block-types/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -69
- 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 +71 -67
- 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 +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/index.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/index.mjs.map +1 -1
- package/dist/astro/routes/api/schema/collections/reorder.mjs +71 -67
- package/dist/astro/routes/api/schema/collections/reorder.mjs.map +1 -1
- package/dist/astro/routes/api/schema/index.mjs +16 -16
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs.map +1 -1
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -67
- package/dist/astro/routes/api/schema/orphans/index.mjs.map +1 -1
- package/dist/astro/routes/api/search/enable.mjs +19 -19
- package/dist/astro/routes/api/search/index.mjs +18 -18
- package/dist/astro/routes/api/search/rebuild.mjs +19 -19
- package/dist/astro/routes/api/search/stats.mjs +9 -9
- package/dist/astro/routes/api/search/suggest.mjs +18 -18
- package/dist/astro/routes/api/sections/_slug_.mjs +18 -18
- package/dist/astro/routes/api/sections/index.mjs +18 -18
- package/dist/astro/routes/api/settings/backups/archives/_name_.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/archives/index.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/export.mjs +7 -7
- package/dist/astro/routes/api/settings/backups/index.mjs +8 -8
- package/dist/astro/routes/api/settings/email.mjs +6 -6
- package/dist/astro/routes/api/settings.mjs +21 -21
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -19
- package/dist/astro/routes/api/setup/admin.mjs +18 -18
- package/dist/astro/routes/api/setup/dev-bypass.mjs +45 -39
- package/dist/astro/routes/api/setup/dev-bypass.mjs.map +1 -1
- package/dist/astro/routes/api/setup/dev-reset.mjs +4 -4
- package/dist/astro/routes/api/setup/index.mjs +50 -44
- package/dist/astro/routes/api/setup/index.mjs.map +1 -1
- package/dist/astro/routes/api/setup/status.mjs +6 -6
- package/dist/astro/routes/api/snapshot.mjs +8 -8
- package/dist/astro/routes/api/taxonomies/_name_/reorder.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/_name_/translations.mjs +22 -22
- package/dist/astro/routes/api/taxonomies/_name_.mjs +23 -23
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs +36 -35
- package/dist/astro/routes/api/taxonomies/bulk-tag.mjs.map +1 -1
- package/dist/astro/routes/api/taxonomies/index.mjs +23 -23
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +8 -8
- package/dist/astro/routes/api/visual-editing/action-token.mjs +6 -6
- package/dist/astro/routes/api/visual-editing/content/_collection_/_id_/publish.mjs +19 -19
- package/dist/astro/routes/api/visual-editing/toolbar-labels.mjs +4 -4
- 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 +16 -16
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +19 -19
- package/dist/astro/routes/api/widget-areas/_name_.mjs +9 -9
- package/dist/astro/routes/api/widget-areas/index.mjs +19 -19
- package/dist/astro/routes/api/widget-components.mjs +5 -5
- package/dist/astro/routes/robots.txt.mjs +6 -6
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +7 -7
- package/dist/astro/types.d.mts +24 -18
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/audit-CrgmE9LE.mjs +127 -0
- package/dist/audit-CrgmE9LE.mjs.map +1 -0
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/authoritative-records-C2YzIdbu.mjs +5172 -0
- package/dist/authoritative-records-C2YzIdbu.mjs.map +1 -0
- package/dist/authorize-WgdKF8QY.mjs +49 -0
- package/dist/authorize-WgdKF8QY.mjs.map +1 -0
- package/dist/backup-Ck8_lMO3.mjs +246 -0
- package/dist/backup-Ck8_lMO3.mjs.map +1 -0
- package/dist/block-types-BQ90asVI.mjs +132 -0
- package/dist/block-types-BQ90asVI.mjs.map +1 -0
- package/dist/block-values-ACFqgB1D.mjs +175 -0
- package/dist/block-values-ACFqgB1D.mjs.map +1 -0
- package/dist/bundle-Db1iNMv_.mjs +667 -0
- package/dist/bundle-Db1iNMv_.mjs.map +1 -0
- package/dist/byline-BayaYGoj.mjs +909 -0
- package/dist/byline-BayaYGoj.mjs.map +1 -0
- package/dist/byline-fields-B8HH-35f.mjs +254 -0
- package/dist/byline-fields-B8HH-35f.mjs.map +1 -0
- package/dist/byline-fields-hMPjf6Eu.mjs +123 -0
- package/dist/byline-fields-hMPjf6Eu.mjs.map +1 -0
- package/dist/byline-registry-B_EK_TQf.mjs +406 -0
- package/dist/byline-registry-B_EK_TQf.mjs.map +1 -0
- package/dist/bylines-DFAaFXWi.mjs +214 -0
- package/dist/bylines-DFAaFXWi.mjs.map +1 -0
- package/dist/bylines-DkIxUxmr.mjs +232 -0
- package/dist/bylines-DkIxUxmr.mjs.map +1 -0
- package/dist/cache-DkvhQ8XE.mjs +108 -0
- package/dist/cache-DkvhQ8XE.mjs.map +1 -0
- package/dist/canonical-CcSuuTlH.mjs +174 -0
- package/dist/canonical-CcSuuTlH.mjs.map +1 -0
- package/dist/capture-triggers-DJEoOTOq.mjs +362 -0
- package/dist/capture-triggers-DJEoOTOq.mjs.map +1 -0
- package/dist/challenge-store-CvBl81AQ.mjs +51 -0
- package/dist/challenge-store-CvBl81AQ.mjs.map +1 -0
- package/dist/checksum-CClweQzI.mjs +162 -0
- package/dist/checksum-CClweQzI.mjs.map +1 -0
- package/dist/chrome-tags-D5caJwwp.mjs +24 -0
- package/dist/chrome-tags-D5caJwwp.mjs.map +1 -0
- package/dist/chunks-DwBaj8aT.mjs +25 -0
- package/dist/chunks-DwBaj8aT.mjs.map +1 -0
- package/dist/cli/index.mjs +374 -761
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +32 -32
- package/dist/client/index.mjs +2 -2
- package/dist/collection-deletion-CLCdXsnV.mjs +436 -0
- package/dist/collection-deletion-CLCdXsnV.mjs.map +1 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs +217 -0
- package/dist/collection-deletion-processor-hNw8x01F.mjs.map +1 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs +85 -0
- package/dist/collection-slugs-cache-CUuiduLq.mjs.map +1 -0
- package/dist/comment-D2uvL63j.mjs +313 -0
- package/dist/comment-D2uvL63j.mjs.map +1 -0
- package/dist/comment-reaction-DevUuzg4.mjs +85 -0
- package/dist/comment-reaction-DevUuzg4.mjs.map +1 -0
- package/dist/comments-Cq0s7_hO.mjs +195 -0
- package/dist/comments-Cq0s7_hO.mjs.map +1 -0
- package/dist/comments-M4EDYAHw.mjs +99 -0
- package/dist/comments-M4EDYAHw.mjs.map +1 -0
- package/dist/components-CuIGwXMs.mjs +108 -0
- package/dist/components-CuIGwXMs.mjs.map +1 -0
- package/dist/config-52Ea5IWt.d.mts +39 -0
- package/dist/config-52Ea5IWt.d.mts.map +1 -0
- package/dist/config-CCz3xOLc.mjs +242 -0
- package/dist/config-CCz3xOLc.mjs.map +1 -0
- package/dist/config-D3d5Qudq.d.mts +6669 -0
- package/dist/config-D3d5Qudq.d.mts.map +1 -0
- package/dist/content-CbnufDsM.mjs +2018 -0
- package/dist/content-CbnufDsM.mjs.map +1 -0
- package/dist/content-list-query-D_7B1FE5.d.mts +26 -0
- package/dist/content-list-query-D_7B1FE5.d.mts.map +1 -0
- package/dist/content-policy-CYu6K1KB.mjs +46 -0
- package/dist/content-policy-CYu6K1KB.mjs.map +1 -0
- package/dist/content-repair-DlDUgFGp.mjs +442 -0
- package/dist/content-repair-DlDUgFGp.mjs.map +1 -0
- package/dist/context-CGQLA1-a.mjs +1922 -0
- package/dist/context-CGQLA1-a.mjs.map +1 -0
- package/dist/cron-c4D5C5Fx.mjs +284 -0
- package/dist/cron-c4D5C5Fx.mjs.map +1 -0
- package/dist/dashboard-CBq9kmOn.mjs +151 -0
- package/dist/dashboard-CBq9kmOn.mjs.map +1 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql-migrations.d.mts +1 -1
- package/dist/db/libsql-migrations.mjs +4 -4
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres-migrations.d.mts +1 -1
- package/dist/db/postgres-migrations.mjs +4 -4
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite-migrations.d.mts +1 -1
- package/dist/db/sqlite-migrations.mjs +4 -4
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/default-DPsys51U.mjs +81 -0
- package/dist/default-DPsys51U.mjs.map +1 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts +9 -0
- package/dist/deferred-tasks-CZ7rzBdo.d.mts.map +1 -0
- package/dist/dev-typegen-HRxwLRcT.mjs +29 -0
- package/dist/dev-typegen-HRxwLRcT.mjs.map +1 -0
- package/dist/device-flow-OcSqE9uY.mjs +521 -0
- package/dist/device-flow-OcSqE9uY.mjs.map +1 -0
- package/dist/digest-DVZ--cE9.mjs +194 -0
- package/dist/digest-DVZ--cE9.mjs.map +1 -0
- package/dist/direct-executor-DyjAqkpT.mjs +104 -0
- package/dist/direct-executor-DyjAqkpT.mjs.map +1 -0
- package/dist/dist-FPR93_xf.mjs +810 -0
- package/dist/dist-FPR93_xf.mjs.map +1 -0
- package/dist/email-console-DyQIgEnz.mjs +50 -0
- package/dist/email-console-DyQIgEnz.mjs.map +1 -0
- package/dist/email-locale-BYb16rVd.mjs +25 -0
- package/dist/email-locale-BYb16rVd.mjs.map +1 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs +4214 -0
- package/dist/emdash-runtime-CrzxJFmF.mjs.map +1 -0
- package/dist/enrich-DBtCncE2.mjs +194 -0
- package/dist/enrich-DBtCncE2.mjs.map +1 -0
- package/dist/entry-lock-BN5y4YbO.d.mts +4481 -0
- package/dist/entry-lock-BN5y4YbO.d.mts.map +1 -0
- package/dist/entry-lock-BaRBHCsH.mjs +1173 -0
- package/dist/entry-lock-BaRBHCsH.mjs.map +1 -0
- package/dist/entry-lock-C6NcnZPV.mjs +163 -0
- package/dist/entry-lock-C6NcnZPV.mjs.map +1 -0
- package/dist/entry-locks-BTyQLdbC.mjs +167 -0
- package/dist/entry-locks-BTyQLdbC.mjs.map +1 -0
- package/dist/error-BfsNNrIE.mjs +90 -0
- package/dist/error-BfsNNrIE.mjs.map +1 -0
- package/dist/errors-BN1QAnEY.mjs +460 -0
- package/dist/errors-BN1QAnEY.mjs.map +1 -0
- package/dist/errors-Bt3goF8I.mjs +120 -0
- package/dist/errors-Bt3goF8I.mjs.map +1 -0
- package/dist/escape-BveidMa2.mjs +9 -0
- package/dist/escape-BveidMa2.mjs.map +1 -0
- package/dist/fence-Bb_IbCxI.mjs +162 -0
- package/dist/fence-Bb_IbCxI.mjs.map +1 -0
- package/dist/field-defs-cache-CsZctvbu.mjs +77 -0
- package/dist/field-defs-cache-CsZctvbu.mjs.map +1 -0
- package/dist/field-map-6m9rF49t.mjs +83 -0
- package/dist/field-map-6m9rF49t.mjs.map +1 -0
- package/dist/focal-point-CZ3d1wK5.mjs +23 -0
- package/dist/focal-point-CZ3d1wK5.mjs.map +1 -0
- package/dist/fts-manager-CCaZTp8y.mjs +443 -0
- package/dist/fts-manager-CCaZTp8y.mjs.map +1 -0
- package/dist/gc-xowRjczI.mjs +75 -0
- package/dist/gc-xowRjczI.mjs.map +1 -0
- package/dist/hash-COVK27Pc.mjs +37 -0
- package/dist/hash-COVK27Pc.mjs.map +1 -0
- package/dist/hook-result-CYSk0XFe.d.mts +31 -0
- package/dist/hook-result-CYSk0XFe.d.mts.map +1 -0
- package/dist/hreflang-CChPV7jx.mjs +105 -0
- package/dist/hreflang-CChPV7jx.mjs.map +1 -0
- package/dist/hreflang-DRslq3QI.d.mts +50 -0
- package/dist/hreflang-DRslq3QI.d.mts.map +1 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs +339 -0
- package/dist/http-route-dispatch-CAdp2onn.mjs.map +1 -0
- package/dist/identity-NVTOOQyq.mjs +35 -0
- package/dist/identity-NVTOOQyq.mjs.map +1 -0
- package/dist/import-wpSO2N0x.mjs +2020 -0
- package/dist/import-wpSO2N0x.mjs.map +1 -0
- package/dist/index-CDs2wq4X.d.mts +623 -0
- package/dist/index-CDs2wq4X.d.mts.map +1 -0
- package/dist/index.d.mts +24 -24
- package/dist/index.mjs +103 -101
- package/dist/install-finalization-D9R9R-W8.mjs +58 -0
- package/dist/install-finalization-D9R9R-W8.mjs.map +1 -0
- package/dist/keys-Bck6LBfF.mjs +61 -0
- package/dist/keys-Bck6LBfF.mjs.map +1 -0
- package/dist/kinds-CYmRESWj.mjs +974 -0
- package/dist/kinds-CYmRESWj.mjs.map +1 -0
- package/dist/lifecycle-C815ZQfV.mjs +25 -0
- package/dist/lifecycle-C815ZQfV.mjs.map +1 -0
- package/dist/load-D99axixL.mjs +28 -0
- package/dist/load-D99axixL.mjs.map +1 -0
- package/dist/loader-CrRPfkHS.mjs +1197 -0
- package/dist/loader-CrRPfkHS.mjs.map +1 -0
- package/dist/loops-DMKlygqX.mjs +203 -0
- package/dist/loops-DMKlygqX.mjs.map +1 -0
- package/dist/manifest-builder-BQzCHNgB.mjs +189 -0
- package/dist/manifest-builder-BQzCHNgB.mjs.map +1 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs +492 -0
- package/dist/manifest-schema-Ci2gmd0u.mjs.map +1 -0
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +4 -4
- package/dist/media/local-runtime.d.mts +14 -14
- package/dist/media/local-runtime.mjs +6 -6
- package/dist/media-BUQePMxP.mjs +373 -0
- package/dist/media-BUQePMxP.mjs.map +1 -0
- package/dist/media-DH8ibNlY.mjs +294 -0
- package/dist/media-DH8ibNlY.mjs.map +1 -0
- package/dist/media-OEIQ3bVc.mjs +408 -0
- package/dist/media-OEIQ3bVc.mjs.map +1 -0
- package/dist/media-allowlist-pYtaBA95.mjs +44 -0
- package/dist/media-allowlist-pYtaBA95.mjs.map +1 -0
- package/dist/media-folders-Bf8_s4de.mjs +210 -0
- package/dist/media-folders-Bf8_s4de.mjs.map +1 -0
- package/dist/media-url-C6klEuNd.mjs +43 -0
- package/dist/media-url-C6klEuNd.mjs.map +1 -0
- package/dist/media-usage-D7Y64m6v.mjs +1629 -0
- package/dist/media-usage-D7Y64m6v.mjs.map +1 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs +78 -0
- package/dist/media-usage-activation-DrqbmgLA.mjs.map +1 -0
- package/dist/media-usage-work-DommYhYA.mjs +152 -0
- package/dist/media-usage-work-DommYhYA.mjs.map +1 -0
- package/dist/media-usage-work-HU63hNDu.mjs +586 -0
- package/dist/media-usage-work-HU63hNDu.mjs.map +1 -0
- package/dist/menus-BQfusWEC.mjs +3608 -0
- package/dist/menus-BQfusWEC.mjs.map +1 -0
- package/dist/menus-BtwjQt5s.mjs +753 -0
- package/dist/menus-BtwjQt5s.mjs.map +1 -0
- package/dist/menus-p_M1V7J_.mjs +139 -0
- package/dist/menus-p_M1V7J_.mjs.map +1 -0
- package/dist/migrations/index.d.mts +1 -1
- package/dist/migrations/index.mjs +3 -3
- package/dist/mime-C94qBG-P.mjs +36 -0
- package/dist/mime-C94qBG-P.mjs.map +1 -0
- package/dist/mode-DpYW3w6U.mjs +23 -0
- package/dist/mode-DpYW3w6U.mjs.map +1 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs +46 -0
- package/dist/node-sqlite-compat-pWFw0lcc.mjs.map +1 -0
- package/dist/normalize-DduyxBjf.mjs +191 -0
- package/dist/normalize-DduyxBjf.mjs.map +1 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs +274 -0
- package/dist/oauth-authorization-DAXsH1H9.mjs.map +1 -0
- package/dist/oauth-clients-DENiDQri.mjs +266 -0
- package/dist/oauth-clients-DENiDQri.mjs.map +1 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs +50 -0
- package/dist/oauth-state-store-y8mEYVq9.mjs.map +1 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs +26 -0
- package/dist/oauth-user-lookup-CtTYAy-O.mjs.map +1 -0
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/options-BYa1FgIM.d.mts +81 -0
- package/dist/options-BYa1FgIM.d.mts.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +5 -5
- package/dist/parse-CORGGhHf.mjs +81 -0
- package/dist/parse-CORGGhHf.mjs.map +1 -0
- package/dist/parse-avNM1xWV.d.mts +168 -0
- package/dist/parse-avNM1xWV.d.mts.map +1 -0
- package/dist/passkey-config-Dih5YeIS.mjs +46 -0
- package/dist/passkey-config-Dih5YeIS.mjs.map +1 -0
- package/dist/paths-d51RFm8M.mjs +77 -0
- package/dist/paths-d51RFm8M.mjs.map +1 -0
- package/dist/patterns-CoqlXUvk.mjs +145 -0
- package/dist/patterns-CoqlXUvk.mjs.map +1 -0
- package/dist/placeholder-D2aksPMF.d.mts +306 -0
- package/dist/placeholder-D2aksPMF.d.mts.map +1 -0
- package/dist/plan-DqeZKuaR.mjs +135 -0
- package/dist/plan-DqeZKuaR.mjs.map +1 -0
- package/dist/plugin-test-runtime.d.mts +14 -14
- package/dist/plugin-test-runtime.mjs +110 -107
- package/dist/plugin-types.d.mts +2 -2
- package/dist/plugin-utils.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.d.mts +12 -12
- package/dist/plugins/adapt-sandbox-entry.mjs +3 -3
- package/dist/plugins/host.d.mts +5 -5
- package/dist/plugins/host.mjs +42 -41
- package/dist/plugins-Bb7oqjQA.mjs +277 -0
- package/dist/plugins-Bb7oqjQA.mjs.map +1 -0
- package/dist/policy-BcEqut3n.mjs +45 -0
- package/dist/policy-BcEqut3n.mjs.map +1 -0
- package/dist/portable-text-DXE8ymtD.mjs +307 -0
- package/dist/portable-text-DXE8ymtD.mjs.map +1 -0
- package/dist/preview-DEDWbwA_.mjs +107 -0
- package/dist/preview-DEDWbwA_.mjs.map +1 -0
- package/dist/protocol-BJbTzvwl.d.mts +61 -0
- package/dist/protocol-BJbTzvwl.d.mts.map +1 -0
- package/dist/public-submission-D9c9S14m.mjs +250 -0
- package/dist/public-submission-D9c9S14m.mjs.map +1 -0
- package/dist/public-url-CIRe-2T6.mjs +101 -0
- package/dist/public-url-CIRe-2T6.mjs.map +1 -0
- package/dist/query-BzifXlPS.mjs +1156 -0
- package/dist/query-BzifXlPS.mjs.map +1 -0
- package/dist/query-OzMJ6vJP.mjs +41 -0
- package/dist/query-OzMJ6vJP.mjs.map +1 -0
- package/dist/rate-limit-Csp60Vik.mjs +120 -0
- package/dist/rate-limit-Csp60Vik.mjs.map +1 -0
- package/dist/receipt-B-aU4hpJ.mjs +43 -0
- package/dist/receipt-B-aU4hpJ.mjs.map +1 -0
- package/dist/redirect-CDSw1sU3.mjs +17 -0
- package/dist/redirect-CDSw1sU3.mjs.map +1 -0
- package/dist/redirect-D1ArbO85.mjs +411 -0
- package/dist/redirect-D1ArbO85.mjs.map +1 -0
- package/dist/redirects-BjTwDTsV.mjs +148 -0
- package/dist/redirects-BjTwDTsV.mjs.map +1 -0
- package/dist/redirects-Ck50kH3n.mjs +446 -0
- package/dist/redirects-Ck50kH3n.mjs.map +1 -0
- package/dist/registry/testing.mjs +3 -3
- package/dist/registry-CFcNCayZ.mjs +6754 -0
- package/dist/registry-CFcNCayZ.mjs.map +1 -0
- package/dist/relations-Cfaa1fDl.mjs +776 -0
- package/dist/relations-Cfaa1fDl.mjs.map +1 -0
- package/dist/request-cache-iHRlHx1d.mjs +104 -0
- package/dist/request-cache-iHRlHx1d.mjs.map +1 -0
- package/dist/request-context.d.mts +1 -1
- package/dist/request-meta-D47mqyev.mjs +141 -0
- package/dist/request-meta-D47mqyev.mjs.map +1 -0
- package/dist/resolve-BPE8sMvx.mjs +99 -0
- package/dist/resolve-BPE8sMvx.mjs.map +1 -0
- package/dist/resolve-C0s1E_fH.mjs +199 -0
- package/dist/resolve-C0s1E_fH.mjs.map +1 -0
- package/dist/revision-j1p4-bOj.mjs +302 -0
- package/dist/revision-j1p4-bOj.mjs.map +1 -0
- package/dist/route-wire-C9PJV9aL.mjs +197 -0
- package/dist/route-wire-C9PJV9aL.mjs.map +1 -0
- package/dist/routes-lyYw0mMf.mjs +272 -0
- package/dist/routes-lyYw0mMf.mjs.map +1 -0
- package/dist/runner-B3eyB9Gb.mjs +6121 -0
- package/dist/runner-B3eyB9Gb.mjs.map +1 -0
- package/dist/runner-DoYH2Jcu.d.mts +68 -0
- package/dist/runner-DoYH2Jcu.d.mts.map +1 -0
- package/dist/runtime.d.mts +13 -13
- package/dist/runtime.mjs +3 -3
- package/dist/schema-BAayK46S.mjs +13 -0
- package/dist/schema-BAayK46S.mjs.map +1 -0
- package/dist/schema-Gqcl-8G4.mjs +815 -0
- package/dist/schema-Gqcl-8G4.mjs.map +1 -0
- package/dist/scopes-BqPOKoKf.mjs +34 -0
- package/dist/scopes-BqPOKoKf.mjs.map +1 -0
- package/dist/search-YJKPIEV6.mjs +448 -0
- package/dist/search-YJKPIEV6.mjs.map +1 -0
- package/dist/sections-BR_e-wK5.mjs +346 -0
- package/dist/sections-BR_e-wK5.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +37 -31
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +22 -21
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-Dsj8hy3j.mjs +114 -0
- package/dist/seo-Dsj8hy3j.mjs.map +1 -0
- package/dist/seo-XvH4LNNp.mjs +133 -0
- package/dist/seo-XvH4LNNp.mjs.map +1 -0
- package/dist/service-BsVG05gS.mjs +150 -0
- package/dist/service-BsVG05gS.mjs.map +1 -0
- package/dist/session-user-DgKbYrlj.mjs +51 -0
- package/dist/session-user-DgKbYrlj.mjs.map +1 -0
- package/dist/settings-CNPUntkh.mjs +51 -0
- package/dist/settings-CNPUntkh.mjs.map +1 -0
- package/dist/settings-D5EHi0Tk.mjs +439 -0
- package/dist/settings-D5EHi0Tk.mjs.map +1 -0
- package/dist/settings-DSfE7wOa.mjs +61 -0
- package/dist/settings-DSfE7wOa.mjs.map +1 -0
- package/dist/setup-complete-B8W8sJ9v.mjs +26 -0
- package/dist/setup-complete-B8W8sJ9v.mjs.map +1 -0
- package/dist/setup-nonce-DnSBP260.mjs +25 -0
- package/dist/setup-nonce-DnSBP260.mjs.map +1 -0
- package/dist/site-settings-NGzdrt7O.mjs +50 -0
- package/dist/site-settings-NGzdrt7O.mjs.map +1 -0
- package/dist/site-url-D6JB7tLW.mjs +16 -0
- package/dist/site-url-D6JB7tLW.mjs.map +1 -0
- package/dist/snapshot-CdcwwWAf.mjs +414 -0
- package/dist/snapshot-CdcwwWAf.mjs.map +1 -0
- package/dist/ssrf-Dv0_tRpo.mjs +406 -0
- package/dist/ssrf-Dv0_tRpo.mjs.map +1 -0
- package/dist/stage-CUjhED3P.mjs +662 -0
- package/dist/stage-CUjhED3P.mjs.map +1 -0
- package/dist/staged-C36IWXff.mjs +659 -0
- package/dist/staged-C36IWXff.mjs.map +1 -0
- package/dist/state-CKouMCSY.mjs +153 -0
- package/dist/state-CKouMCSY.mjs.map +1 -0
- package/dist/status-lzyj4Uu7.mjs +30 -0
- package/dist/status-lzyj4Uu7.mjs.map +1 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/storage-query-B-cWcTjJ.d.mts +1594 -0
- package/dist/storage-query-B-cWcTjJ.d.mts.map +1 -0
- package/dist/tar-DsTXX6ch.mjs +449 -0
- package/dist/tar-DsTXX6ch.mjs.map +1 -0
- package/dist/target-DLQCwp_Z.mjs +27 -0
- package/dist/target-DLQCwp_Z.mjs.map +1 -0
- package/dist/taxonomies-BlAjr4BL.mjs +697 -0
- package/dist/taxonomies-BlAjr4BL.mjs.map +1 -0
- package/dist/taxonomies-Byyo7LOZ.mjs +939 -0
- package/dist/taxonomies-Byyo7LOZ.mjs.map +1 -0
- package/dist/taxonomy-CKDwM61Y.mjs +525 -0
- package/dist/taxonomy-CKDwM61Y.mjs.map +1 -0
- package/dist/tokens-BojXlk49.mjs +171 -0
- package/dist/tokens-BojXlk49.mjs.map +1 -0
- package/dist/transaction-DLPQWik1.mjs +29 -0
- package/dist/transaction-DLPQWik1.mjs.map +1 -0
- package/dist/transfer-XSTh2BCr.mjs +8706 -0
- package/dist/transfer-XSTh2BCr.mjs.map +1 -0
- package/dist/transfer-download-DkoCDA9d.mjs +33 -0
- package/dist/transfer-download-DkoCDA9d.mjs.map +1 -0
- package/dist/transfer-iQ26J-RT.mjs +166 -0
- package/dist/transfer-iQ26J-RT.mjs.map +1 -0
- package/dist/transformations-C7RQabKQ.mjs +196 -0
- package/dist/transformations-C7RQabKQ.mjs.map +1 -0
- package/dist/transport-D3RulfD6.mjs +136 -0
- package/dist/transport-D3RulfD6.mjs.map +1 -0
- package/dist/transport-DhlZlf4D.d.mts +42 -0
- package/dist/transport-DhlZlf4D.d.mts.map +1 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs +51 -0
- package/dist/trusted-proxy-B6ECOZJc.mjs.map +1 -0
- package/dist/turnstile-lqUiY7lP.mjs +53 -0
- package/dist/turnstile-lqUiY7lP.mjs.map +1 -0
- package/dist/types-4Dn9bZhu.mjs +77 -0
- package/dist/types-4Dn9bZhu.mjs.map +1 -0
- package/dist/types-5LSo7PPx.d.mts +85 -0
- package/dist/types-5LSo7PPx.d.mts.map +1 -0
- package/dist/types-BQ3hwYJT.d.mts +896 -0
- package/dist/types-BQ3hwYJT.d.mts.map +1 -0
- package/dist/types-BYEk7qo3.d.mts +198 -0
- package/dist/types-BYEk7qo3.d.mts.map +1 -0
- package/dist/types-CJKsWVFR.mjs +199 -0
- package/dist/types-CJKsWVFR.mjs.map +1 -0
- package/dist/types-Ca_w8mmY.d.mts +363 -0
- package/dist/types-Ca_w8mmY.d.mts.map +1 -0
- package/dist/types-CkE41ZAG.mjs +18 -0
- package/dist/types-CkE41ZAG.mjs.map +1 -0
- package/dist/types-D0aJW2uR.d.mts +1641 -0
- package/dist/types-D0aJW2uR.d.mts.map +1 -0
- package/dist/types-DbpN4Qto.d.mts +372 -0
- package/dist/types-DbpN4Qto.d.mts.map +1 -0
- package/dist/types-ILDI1sdY.mjs +16 -0
- package/dist/types-ILDI1sdY.mjs.map +1 -0
- package/dist/types-OC5c-edM.mjs +22 -0
- package/dist/types-OC5c-edM.mjs.map +1 -0
- package/dist/types-aOOxRSx6.mjs +103 -0
- package/dist/types-aOOxRSx6.mjs.map +1 -0
- package/dist/types-m1WbUffD.d.mts +198 -0
- package/dist/types-m1WbUffD.d.mts.map +1 -0
- package/dist/types-uxLoPBio.d.mts +124 -0
- package/dist/types-uxLoPBio.d.mts.map +1 -0
- package/dist/types-we5uR-tV.d.mts +287 -0
- package/dist/types-we5uR-tV.d.mts.map +1 -0
- package/dist/upload-attempts-DduMy6B0.mjs +32 -0
- package/dist/upload-attempts-DduMy6B0.mjs.map +1 -0
- package/dist/url-pattern-B3EwxAAk.mjs +33 -0
- package/dist/url-pattern-B3EwxAAk.mjs.map +1 -0
- package/dist/user-ElwQjTQT.mjs +171 -0
- package/dist/user-ElwQjTQT.mjs.map +1 -0
- package/dist/utils-BlAXmfOG.mjs +439 -0
- package/dist/utils-BlAXmfOG.mjs.map +1 -0
- package/dist/validate-CH0X5b2c.d.mts +468 -0
- package/dist/validate-CH0X5b2c.d.mts.map +1 -0
- package/dist/validate-CfgRpcjA.mjs +492 -0
- package/dist/validate-CfgRpcjA.mjs.map +1 -0
- package/dist/validation-DvYJtv4k.mjs +218 -0
- package/dist/validation-DvYJtv4k.mjs.map +1 -0
- package/dist/version-DgYjhTud.mjs +9 -0
- package/dist/version-DgYjhTud.mjs.map +1 -0
- package/dist/version-Dq71scUb.mjs +7 -0
- package/dist/version-Dq71scUb.mjs.map +1 -0
- package/dist/widgets-ChFIj0be.mjs +126 -0
- package/dist/widgets-ChFIj0be.mjs.map +1 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs +372 -0
- package/dist/wxr-taxonomies-CBZMp2YX.mjs.map +1 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts +34 -0
- package/dist/wxr-taxonomies-DlKDpWN1.d.mts.map +1 -0
- package/dist/zod-generator-DmTKI-Ig.mjs +426 -0
- package/dist/zod-generator-DmTKI-Ig.mjs.map +1 -0
- package/package.json +7 -6
- package/src/api/handlers/content.ts +593 -16
- package/src/api/handlers/device-flow.ts +74 -21
- package/src/api/handlers/manifest.ts +79 -5
- package/src/api/handlers/relations.ts +638 -157
- package/src/api/handlers/revision.ts +30 -0
- package/src/api/handlers/schema.ts +403 -1
- package/src/api/handlers/staged-references.ts +142 -0
- package/src/api/handlers/validate-references.ts +146 -0
- package/src/api/schemas/content.ts +13 -0
- package/src/api/schemas/relations.ts +54 -44
- package/src/api/schemas/schema.ts +14 -0
- package/src/astro/integration/routes.ts +15 -19
- package/src/astro/routes/api/content/[collection]/[id]/references/[relation]/children.ts +11 -54
- package/src/astro/routes/api/content/[collection]/[id].ts +3 -1
- package/src/astro/routes/api/oauth/device/authorize.ts +33 -4
- package/src/astro/routes/api/relations/index.ts +4 -4
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +6 -2
- package/src/astro/types.ts +5 -0
- package/src/cli/commands/export-seed.ts +510 -89
- package/src/components/WidgetArea.astro +3 -2
- package/src/database/migrations/086_relations_structural.ts +197 -0
- package/src/database/migrations/087_reference_field_relations.ts +407 -0
- package/src/database/migrations/runner.ts +4 -0
- package/src/database/reference-backfill.ts +141 -0
- package/src/database/repositories/content.ts +43 -8
- package/src/database/repositories/relation.ts +620 -208
- package/src/database/repositories/revision.ts +16 -0
- package/src/database/repositories/types.ts +38 -0
- package/src/database/transaction.ts +12 -1
- package/src/database/types.ts +14 -5
- package/src/emdash-runtime.ts +86 -11
- package/src/index.ts +10 -0
- package/src/loader.ts +169 -22
- package/src/query.ts +455 -25
- package/src/references/field-map.ts +115 -0
- package/src/references/resolve.ts +160 -0
- package/src/references/staged.ts +117 -0
- package/src/references/types.ts +16 -0
- package/src/registry/artifact-fetch.ts +45 -271
- package/src/schema/registry.ts +99 -24
- package/src/schema/types.ts +58 -0
- package/src/schema/zod-generator.ts +67 -1
- package/src/seed/apply.ts +519 -62
- package/src/seed/types.ts +36 -2
- package/src/seed/validate.ts +78 -2
- package/src/transfer/analyze/unique-keys.ts +3 -12
- package/src/transfer/analyze/validate.ts +65 -39
- package/src/transfer/analyze/values.ts +12 -1
- package/src/transfer/export/readers.ts +12 -8
- package/src/transfer/format/columns.ts +26 -6
- package/src/transfer/format/kinds.ts +21 -5
- package/src/transfer/import/context.ts +8 -1
- package/src/transfer/ops/package-index.ts +1 -1
- package/dist/action-token-DYwe4Pk0.mjs +0 -26
- package/dist/action-token-DYwe4Pk0.mjs.map +0 -1
- package/dist/activation-LOkDM5WT.mjs +0 -382
- package/dist/activation-LOkDM5WT.mjs.map +0 -1
- package/dist/adapters-B64LbYcB.d.mts +0 -171
- package/dist/adapters-B64LbYcB.d.mts.map +0 -1
- package/dist/allowed-origins-CHB8oZNM.mjs +0 -116
- package/dist/allowed-origins-CHB8oZNM.mjs.map +0 -1
- package/dist/api-CuyNEHZG.mjs +0 -4718
- package/dist/api-CuyNEHZG.mjs.map +0 -1
- package/dist/api-tokens-s4i4aUp_.mjs +0 -166
- package/dist/api-tokens-s4i4aUp_.mjs.map +0 -1
- package/dist/apply-npY1TAhG.mjs +0 -1366
- package/dist/apply-npY1TAhG.mjs.map +0 -1
- package/dist/approvals-CqMfNxak.mjs +0 -460
- package/dist/approvals-CqMfNxak.mjs.map +0 -1
- package/dist/artifact-fetch-DZMOGZ3-.mjs +0 -818
- package/dist/artifact-fetch-DZMOGZ3-.mjs.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.d.mts +0 -8
- package/dist/astro/routes/api/relations/_id_/translations.d.mts.map +0 -1
- package/dist/astro/routes/api/relations/_id_/translations.mjs +0 -47
- package/dist/astro/routes/api/relations/_id_/translations.mjs.map +0 -1
- package/dist/audit-RfCugiSB.mjs +0 -127
- package/dist/audit-RfCugiSB.mjs.map +0 -1
- package/dist/authoritative-records-CoJvBXAD.mjs +0 -5172
- package/dist/authoritative-records-CoJvBXAD.mjs.map +0 -1
- package/dist/authorize-seCifOMJ.mjs +0 -49
- package/dist/authorize-seCifOMJ.mjs.map +0 -1
- package/dist/backup-BQRj3afm.mjs +0 -246
- package/dist/backup-BQRj3afm.mjs.map +0 -1
- package/dist/block-type-registry-DUI_3KxT.mjs +0 -6709
- package/dist/block-type-registry-DUI_3KxT.mjs.map +0 -1
- package/dist/block-types-BmZmLmAD.mjs +0 -132
- package/dist/block-types-BmZmLmAD.mjs.map +0 -1
- package/dist/block-values-C_VIPr5t.mjs +0 -175
- package/dist/block-values-C_VIPr5t.mjs.map +0 -1
- package/dist/byline-DYmkXqvo.mjs +0 -909
- package/dist/byline-DYmkXqvo.mjs.map +0 -1
- package/dist/byline-fields-D28AT-Fh.mjs +0 -123
- package/dist/byline-fields-D28AT-Fh.mjs.map +0 -1
- package/dist/byline-registry-gnKscbQX.mjs +0 -406
- package/dist/byline-registry-gnKscbQX.mjs.map +0 -1
- package/dist/bylines-BPwJqoYH.mjs +0 -232
- package/dist/bylines-BPwJqoYH.mjs.map +0 -1
- package/dist/bylines-ukLaYpVZ.mjs +0 -214
- package/dist/bylines-ukLaYpVZ.mjs.map +0 -1
- package/dist/cache-m7UEkRFV.mjs +0 -108
- package/dist/cache-m7UEkRFV.mjs.map +0 -1
- package/dist/canonical-YhEQezjg.mjs +0 -174
- package/dist/canonical-YhEQezjg.mjs.map +0 -1
- package/dist/capture-triggers-kJyl_yyM.mjs +0 -362
- package/dist/capture-triggers-kJyl_yyM.mjs.map +0 -1
- package/dist/challenge-store-ppU6Uv13.mjs +0 -51
- package/dist/challenge-store-ppU6Uv13.mjs.map +0 -1
- package/dist/checksum-B2IINIlN.mjs +0 -162
- package/dist/checksum-B2IINIlN.mjs.map +0 -1
- package/dist/chrome-tags-DApCQSIk.mjs +0 -24
- package/dist/chrome-tags-DApCQSIk.mjs.map +0 -1
- package/dist/chunks-Dms7Uxbt.mjs +0 -25
- package/dist/chunks-Dms7Uxbt.mjs.map +0 -1
- package/dist/collection-deletion-BIm28mo3.mjs +0 -436
- package/dist/collection-deletion-BIm28mo3.mjs.map +0 -1
- package/dist/collection-deletion-processor-Br6rxs3u.mjs +0 -217
- package/dist/collection-deletion-processor-Br6rxs3u.mjs.map +0 -1
- package/dist/collection-slugs-cache-CjGk__zp.mjs +0 -85
- package/dist/collection-slugs-cache-CjGk__zp.mjs.map +0 -1
- package/dist/comment-CrBl22OF.mjs +0 -313
- package/dist/comment-CrBl22OF.mjs.map +0 -1
- package/dist/comment-reaction-JEQ2Fpd8.mjs +0 -85
- package/dist/comment-reaction-JEQ2Fpd8.mjs.map +0 -1
- package/dist/comments-2ah9du9y.mjs +0 -195
- package/dist/comments-2ah9du9y.mjs.map +0 -1
- package/dist/comments-fHZ8ON9O.mjs +0 -99
- package/dist/comments-fHZ8ON9O.mjs.map +0 -1
- package/dist/components-CXbq7CSM.mjs +0 -108
- package/dist/components-CXbq7CSM.mjs.map +0 -1
- package/dist/config-BjEm_3xL.d.mts +0 -6537
- package/dist/config-BjEm_3xL.d.mts.map +0 -1
- package/dist/config-IhybvkIQ.mjs +0 -242
- package/dist/config-IhybvkIQ.mjs.map +0 -1
- package/dist/config-Py43JK9r.d.mts +0 -39
- package/dist/config-Py43JK9r.d.mts.map +0 -1
- package/dist/content-DFaIEDj9.mjs +0 -2281
- package/dist/content-DFaIEDj9.mjs.map +0 -1
- package/dist/content-list-query-Dra4Dalc.d.mts +0 -26
- package/dist/content-list-query-Dra4Dalc.d.mts.map +0 -1
- package/dist/content-policy-DFNw91-d.mjs +0 -46
- package/dist/content-policy-DFNw91-d.mjs.map +0 -1
- package/dist/content-repair-Q8IUrpLL.mjs +0 -442
- package/dist/content-repair-Q8IUrpLL.mjs.map +0 -1
- package/dist/context-BV_7t-Ua.mjs +0 -1921
- package/dist/context-BV_7t-Ua.mjs.map +0 -1
- package/dist/cron-7DCJwPXq.mjs +0 -284
- package/dist/cron-7DCJwPXq.mjs.map +0 -1
- package/dist/dashboard-BP-iJqpd.mjs +0 -151
- package/dist/dashboard-BP-iJqpd.mjs.map +0 -1
- package/dist/default-DQ6vsviu.mjs +0 -81
- package/dist/default-DQ6vsviu.mjs.map +0 -1
- package/dist/deferred-tasks-BPxXUB4x.d.mts +0 -9
- package/dist/deferred-tasks-BPxXUB4x.d.mts.map +0 -1
- package/dist/dev-typegen-CZaPLl3V.mjs +0 -29
- package/dist/dev-typegen-CZaPLl3V.mjs.map +0 -1
- package/dist/device-flow-CRd6DXmW.mjs +0 -466
- package/dist/device-flow-CRd6DXmW.mjs.map +0 -1
- package/dist/digest-BarSh-pN.mjs +0 -194
- package/dist/digest-BarSh-pN.mjs.map +0 -1
- package/dist/direct-executor-D2lNadwo.mjs +0 -104
- package/dist/direct-executor-D2lNadwo.mjs.map +0 -1
- package/dist/dist-BNwANFJR.mjs +0 -810
- package/dist/dist-BNwANFJR.mjs.map +0 -1
- package/dist/email-console-bJn3ctqA.mjs +0 -50
- package/dist/email-console-bJn3ctqA.mjs.map +0 -1
- package/dist/email-locale-CN6WAMx0.mjs +0 -25
- package/dist/email-locale-CN6WAMx0.mjs.map +0 -1
- package/dist/emdash-runtime-CtfnZmPi.mjs +0 -4186
- package/dist/emdash-runtime-CtfnZmPi.mjs.map +0 -1
- package/dist/enrich-Dl3kZ-lP.mjs +0 -194
- package/dist/enrich-Dl3kZ-lP.mjs.map +0 -1
- package/dist/entry-lock-BJYdBfXb.mjs +0 -1097
- package/dist/entry-lock-BJYdBfXb.mjs.map +0 -1
- package/dist/entry-lock-Cf5OoIgN.d.mts +0 -4368
- package/dist/entry-lock-Cf5OoIgN.d.mts.map +0 -1
- package/dist/entry-lock-DHQOxN7R.mjs +0 -163
- package/dist/entry-lock-DHQOxN7R.mjs.map +0 -1
- package/dist/entry-locks-D0foLdjQ.mjs +0 -167
- package/dist/entry-locks-D0foLdjQ.mjs.map +0 -1
- package/dist/error-CfvOHP0M.mjs +0 -90
- package/dist/error-CfvOHP0M.mjs.map +0 -1
- package/dist/errors-BF0_LFhW.mjs +0 -460
- package/dist/errors-BF0_LFhW.mjs.map +0 -1
- package/dist/errors-DgE1zJGG.mjs +0 -120
- package/dist/errors-DgE1zJGG.mjs.map +0 -1
- package/dist/escape-CuaZhZvL.mjs +0 -9
- package/dist/escape-CuaZhZvL.mjs.map +0 -1
- package/dist/fence-CMDXJYc_.mjs +0 -162
- package/dist/fence-CMDXJYc_.mjs.map +0 -1
- package/dist/field-defs-cache-HIgBbqZZ.mjs +0 -77
- package/dist/field-defs-cache-HIgBbqZZ.mjs.map +0 -1
- package/dist/focal-point-Gr34o-4o.mjs +0 -23
- package/dist/focal-point-Gr34o-4o.mjs.map +0 -1
- package/dist/fts-manager-S-K0laoS.mjs +0 -443
- package/dist/fts-manager-S-K0laoS.mjs.map +0 -1
- package/dist/gc-DjKY0Ay1.mjs +0 -75
- package/dist/gc-DjKY0Ay1.mjs.map +0 -1
- package/dist/hash-SDAW6zC-.mjs +0 -37
- package/dist/hash-SDAW6zC-.mjs.map +0 -1
- package/dist/hook-result-B5bXDgS2.d.mts +0 -31
- package/dist/hook-result-B5bXDgS2.d.mts.map +0 -1
- package/dist/hreflang-CbVI4paR.mjs +0 -105
- package/dist/hreflang-CbVI4paR.mjs.map +0 -1
- package/dist/hreflang-D5uNnsGJ.d.mts +0 -50
- package/dist/hreflang-D5uNnsGJ.d.mts.map +0 -1
- package/dist/http-route-dispatch-BitqzwMy.mjs +0 -339
- package/dist/http-route-dispatch-BitqzwMy.mjs.map +0 -1
- package/dist/identity-Be5kzutJ.mjs +0 -35
- package/dist/identity-Be5kzutJ.mjs.map +0 -1
- package/dist/import-YzfKCaco.mjs +0 -2020
- package/dist/import-YzfKCaco.mjs.map +0 -1
- package/dist/index-D-hdtLe8.d.mts +0 -623
- package/dist/index-D-hdtLe8.d.mts.map +0 -1
- package/dist/install-finalization-DfM1fj5x.mjs +0 -58
- package/dist/install-finalization-DfM1fj5x.mjs.map +0 -1
- package/dist/keys-yxLm5l35.mjs +0 -61
- package/dist/keys-yxLm5l35.mjs.map +0 -1
- package/dist/kinds-CRu_T5T5.mjs +0 -961
- package/dist/kinds-CRu_T5T5.mjs.map +0 -1
- package/dist/lifecycle-BzeGPeQ-.mjs +0 -25
- package/dist/lifecycle-BzeGPeQ-.mjs.map +0 -1
- package/dist/load-XgJiE6_3.mjs +0 -28
- package/dist/load-XgJiE6_3.mjs.map +0 -1
- package/dist/loader-BzqeR1ZN.mjs +0 -1086
- package/dist/loader-BzqeR1ZN.mjs.map +0 -1
- package/dist/loops-BQSzv5Zn.mjs +0 -203
- package/dist/loops-BQSzv5Zn.mjs.map +0 -1
- package/dist/manifest-builder-BmSAOOEF.mjs +0 -189
- package/dist/manifest-builder-BmSAOOEF.mjs.map +0 -1
- package/dist/manifest-schema-CY3zng_M.mjs +0 -492
- package/dist/manifest-schema-CY3zng_M.mjs.map +0 -1
- package/dist/media-CPXTbb1R.mjs +0 -373
- package/dist/media-CPXTbb1R.mjs.map +0 -1
- package/dist/media-JXRWDhw3.mjs +0 -294
- package/dist/media-JXRWDhw3.mjs.map +0 -1
- package/dist/media-Pu1L6xir.mjs +0 -408
- package/dist/media-Pu1L6xir.mjs.map +0 -1
- package/dist/media-allowlist-BSoa9Vvm.mjs +0 -44
- package/dist/media-allowlist-BSoa9Vvm.mjs.map +0 -1
- package/dist/media-folders-BE0oo2eX.mjs +0 -210
- package/dist/media-folders-BE0oo2eX.mjs.map +0 -1
- package/dist/media-url-jArBpzIG.mjs +0 -43
- package/dist/media-url-jArBpzIG.mjs.map +0 -1
- package/dist/media-usage-De-zeR9E.mjs +0 -1629
- package/dist/media-usage-De-zeR9E.mjs.map +0 -1
- package/dist/media-usage-activation-HKp7zk7W.mjs +0 -78
- package/dist/media-usage-activation-HKp7zk7W.mjs.map +0 -1
- package/dist/media-usage-work-C2OZLCAd.mjs +0 -586
- package/dist/media-usage-work-C2OZLCAd.mjs.map +0 -1
- package/dist/media-usage-work-DwUNbgvS.mjs +0 -152
- package/dist/media-usage-work-DwUNbgvS.mjs.map +0 -1
- package/dist/menus-BM7BPLOb.mjs +0 -139
- package/dist/menus-BM7BPLOb.mjs.map +0 -1
- package/dist/menus-Cm68rsAq.mjs +0 -3608
- package/dist/menus-Cm68rsAq.mjs.map +0 -1
- package/dist/menus-ITeAbcIF.mjs +0 -753
- package/dist/menus-ITeAbcIF.mjs.map +0 -1
- package/dist/mime-ChLqYwDk.mjs +0 -36
- package/dist/mime-ChLqYwDk.mjs.map +0 -1
- package/dist/mode-CCuKXUci.mjs +0 -23
- package/dist/mode-CCuKXUci.mjs.map +0 -1
- package/dist/node-sqlite-compat-CONMsl-x.mjs +0 -46
- package/dist/node-sqlite-compat-CONMsl-x.mjs.map +0 -1
- package/dist/normalize-CO2P8-iE.mjs +0 -191
- package/dist/normalize-CO2P8-iE.mjs.map +0 -1
- package/dist/oauth-authorization-DlMIL5_h.mjs +0 -274
- package/dist/oauth-authorization-DlMIL5_h.mjs.map +0 -1
- package/dist/oauth-clients-Djq9r_KP.mjs +0 -266
- package/dist/oauth-clients-Djq9r_KP.mjs.map +0 -1
- package/dist/oauth-state-store-BbjnZXNC.mjs +0 -50
- package/dist/oauth-state-store-BbjnZXNC.mjs.map +0 -1
- package/dist/oauth-user-lookup-vue9a64A.mjs +0 -26
- package/dist/oauth-user-lookup-vue9a64A.mjs.map +0 -1
- package/dist/options-SQCHQCPH.d.mts +0 -81
- package/dist/options-SQCHQCPH.d.mts.map +0 -1
- package/dist/parse-CVgO-Qai.d.mts +0 -168
- package/dist/parse-CVgO-Qai.d.mts.map +0 -1
- package/dist/parse-DY6OD1j_.mjs +0 -81
- package/dist/parse-DY6OD1j_.mjs.map +0 -1
- package/dist/passkey-config-X_H8128a.mjs +0 -46
- package/dist/passkey-config-X_H8128a.mjs.map +0 -1
- package/dist/paths-JxokKIbr.mjs +0 -77
- package/dist/paths-JxokKIbr.mjs.map +0 -1
- package/dist/patterns-BhAvqO0S.mjs +0 -145
- package/dist/patterns-BhAvqO0S.mjs.map +0 -1
- package/dist/placeholder-MSEd8gty.d.mts +0 -306
- package/dist/placeholder-MSEd8gty.d.mts.map +0 -1
- package/dist/plan-xjcWrAah.mjs +0 -135
- package/dist/plan-xjcWrAah.mjs.map +0 -1
- package/dist/plugins-DUXUt8B9.mjs +0 -277
- package/dist/plugins-DUXUt8B9.mjs.map +0 -1
- package/dist/policy-CUvwAARc.mjs +0 -45
- package/dist/policy-CUvwAARc.mjs.map +0 -1
- package/dist/portable-text-5O_ZGUjB.mjs +0 -307
- package/dist/portable-text-5O_ZGUjB.mjs.map +0 -1
- package/dist/preview-CIUcPYr6.mjs +0 -107
- package/dist/preview-CIUcPYr6.mjs.map +0 -1
- package/dist/protocol-B97DZaFr.d.mts +0 -61
- package/dist/protocol-B97DZaFr.d.mts.map +0 -1
- package/dist/public-submission-BFBUrqst.mjs +0 -250
- package/dist/public-submission-BFBUrqst.mjs.map +0 -1
- package/dist/public-url-Bn7U0D7-.mjs +0 -101
- package/dist/public-url-Bn7U0D7-.mjs.map +0 -1
- package/dist/query-B48peoRT.mjs +0 -890
- package/dist/query-B48peoRT.mjs.map +0 -1
- package/dist/query-C4IH0uhR.mjs +0 -41
- package/dist/query-C4IH0uhR.mjs.map +0 -1
- package/dist/rate-limit-BZ6nybgc.mjs +0 -120
- package/dist/rate-limit-BZ6nybgc.mjs.map +0 -1
- package/dist/receipt-B4wJj5Jq.mjs +0 -43
- package/dist/receipt-B4wJj5Jq.mjs.map +0 -1
- package/dist/redirect-B29UjdUn.mjs +0 -411
- package/dist/redirect-B29UjdUn.mjs.map +0 -1
- package/dist/redirect-Cd1E7VUt.mjs +0 -17
- package/dist/redirect-Cd1E7VUt.mjs.map +0 -1
- package/dist/redirects-Ca2MPfEG.mjs +0 -446
- package/dist/redirects-Ca2MPfEG.mjs.map +0 -1
- package/dist/redirects-Cv9apQKj.mjs +0 -148
- package/dist/redirects-Cv9apQKj.mjs.map +0 -1
- package/dist/relation-M4NUCb0b.mjs +0 -334
- package/dist/relation-M4NUCb0b.mjs.map +0 -1
- package/dist/relations-CCif47Oq.mjs +0 -403
- package/dist/relations-CCif47Oq.mjs.map +0 -1
- package/dist/relations-CK9CYUyr.mjs +0 -310
- package/dist/relations-CK9CYUyr.mjs.map +0 -1
- package/dist/request-cache-DzLYKm_x.mjs +0 -104
- package/dist/request-cache-DzLYKm_x.mjs.map +0 -1
- package/dist/request-meta-sZXt3sRo.mjs +0 -141
- package/dist/request-meta-sZXt3sRo.mjs.map +0 -1
- package/dist/resolve-2WbQsCvT.mjs +0 -199
- package/dist/resolve-2WbQsCvT.mjs.map +0 -1
- package/dist/route-wire--1hLuACz.mjs +0 -197
- package/dist/route-wire--1hLuACz.mjs.map +0 -1
- package/dist/routes-vrR95WR6.mjs +0 -272
- package/dist/routes-vrR95WR6.mjs.map +0 -1
- package/dist/runner-1y4J9fJB.mjs +0 -5742
- package/dist/runner-1y4J9fJB.mjs.map +0 -1
- package/dist/runner-D5_LzKXI.d.mts +0 -68
- package/dist/runner-D5_LzKXI.d.mts.map +0 -1
- package/dist/schema-BABiRdsH.mjs +0 -13
- package/dist/schema-BABiRdsH.mjs.map +0 -1
- package/dist/schema-Du3MzCG0.mjs +0 -446
- package/dist/schema-Du3MzCG0.mjs.map +0 -1
- package/dist/scopes-Dbk-ElhT.mjs +0 -34
- package/dist/scopes-Dbk-ElhT.mjs.map +0 -1
- package/dist/search-Bt1PL1jf.mjs +0 -448
- package/dist/search-Bt1PL1jf.mjs.map +0 -1
- package/dist/sections-Ddptx_o9.mjs +0 -346
- package/dist/sections-Ddptx_o9.mjs.map +0 -1
- package/dist/seo-CZT2oLtT.mjs +0 -114
- package/dist/seo-CZT2oLtT.mjs.map +0 -1
- package/dist/seo-D5w3-Azy.mjs +0 -133
- package/dist/seo-D5w3-Azy.mjs.map +0 -1
- package/dist/service-DuykXPyW.mjs +0 -150
- package/dist/service-DuykXPyW.mjs.map +0 -1
- package/dist/session-user-BhaVp8w0.mjs +0 -51
- package/dist/session-user-BhaVp8w0.mjs.map +0 -1
- package/dist/settings-B4vDl1fK.mjs +0 -439
- package/dist/settings-B4vDl1fK.mjs.map +0 -1
- package/dist/settings-DYidIB26.mjs +0 -61
- package/dist/settings-DYidIB26.mjs.map +0 -1
- package/dist/settings-Dyj6v8C4.mjs +0 -51
- package/dist/settings-Dyj6v8C4.mjs.map +0 -1
- package/dist/setup-complete-bOogcHWG.mjs +0 -26
- package/dist/setup-complete-bOogcHWG.mjs.map +0 -1
- package/dist/setup-nonce-0EGuKM4s.mjs +0 -25
- package/dist/setup-nonce-0EGuKM4s.mjs.map +0 -1
- package/dist/site-settings-DOgRUoFX.mjs +0 -50
- package/dist/site-settings-DOgRUoFX.mjs.map +0 -1
- package/dist/site-url-BU_bbxwj.mjs +0 -16
- package/dist/site-url-BU_bbxwj.mjs.map +0 -1
- package/dist/snapshot-PawoX-WG.mjs +0 -414
- package/dist/snapshot-PawoX-WG.mjs.map +0 -1
- package/dist/ssrf-CJUnJymJ.mjs +0 -406
- package/dist/ssrf-CJUnJymJ.mjs.map +0 -1
- package/dist/stage-DgrBz_du.mjs +0 -662
- package/dist/stage-DgrBz_du.mjs.map +0 -1
- package/dist/state-DDiPySSG.mjs +0 -153
- package/dist/state-DDiPySSG.mjs.map +0 -1
- package/dist/status-DZKIG4a9.mjs +0 -30
- package/dist/status-DZKIG4a9.mjs.map +0 -1
- package/dist/storage-query-FXJH5pI8.d.mts +0 -1581
- package/dist/storage-query-FXJH5pI8.d.mts.map +0 -1
- package/dist/tar-_1AgTYFu.mjs +0 -449
- package/dist/tar-_1AgTYFu.mjs.map +0 -1
- package/dist/target-_7pn2Gbg.mjs +0 -27
- package/dist/target-_7pn2Gbg.mjs.map +0 -1
- package/dist/taxonomies-C1IwNe8Q.mjs +0 -697
- package/dist/taxonomies-C1IwNe8Q.mjs.map +0 -1
- package/dist/taxonomies-C_XMoRcX.mjs +0 -939
- package/dist/taxonomies-C_XMoRcX.mjs.map +0 -1
- package/dist/taxonomy-C3Fu1YeH.mjs +0 -525
- package/dist/taxonomy-C3Fu1YeH.mjs.map +0 -1
- package/dist/tokens-u78jETkX.mjs +0 -171
- package/dist/tokens-u78jETkX.mjs.map +0 -1
- package/dist/transaction-BcJO4Tmc.mjs +0 -29
- package/dist/transaction-BcJO4Tmc.mjs.map +0 -1
- package/dist/transfer-DIGvR9Af.mjs +0 -166
- package/dist/transfer-DIGvR9Af.mjs.map +0 -1
- package/dist/transfer-DgeCvHnj.mjs +0 -8675
- package/dist/transfer-DgeCvHnj.mjs.map +0 -1
- package/dist/transfer-download-Pml7RMio.mjs +0 -33
- package/dist/transfer-download-Pml7RMio.mjs.map +0 -1
- package/dist/transformations-9gfpwY65.mjs +0 -196
- package/dist/transformations-9gfpwY65.mjs.map +0 -1
- package/dist/transport-BIfH7_hx.d.mts +0 -42
- package/dist/transport-BIfH7_hx.d.mts.map +0 -1
- package/dist/transport-DKWIq53q.mjs +0 -136
- package/dist/transport-DKWIq53q.mjs.map +0 -1
- package/dist/trusted-proxy-tKiVtyTD.mjs +0 -51
- package/dist/trusted-proxy-tKiVtyTD.mjs.map +0 -1
- package/dist/turnstile-DpsoyOfg.mjs +0 -53
- package/dist/turnstile-DpsoyOfg.mjs.map +0 -1
- package/dist/types-B4sUC2p1.d.mts +0 -198
- package/dist/types-B4sUC2p1.d.mts.map +0 -1
- package/dist/types-B7Lmsh1E.d.mts +0 -887
- package/dist/types-B7Lmsh1E.d.mts.map +0 -1
- package/dist/types-BZakh7Ym.mjs +0 -22
- package/dist/types-BZakh7Ym.mjs.map +0 -1
- package/dist/types-B_CppEmv.d.mts +0 -264
- package/dist/types-B_CppEmv.d.mts.map +0 -1
- package/dist/types-BcrBrE6-.mjs +0 -159
- package/dist/types-BcrBrE6-.mjs.map +0 -1
- package/dist/types-BkUg2yHx.mjs +0 -92
- package/dist/types-BkUg2yHx.mjs.map +0 -1
- package/dist/types-CAZgq9fO.d.mts +0 -124
- package/dist/types-CAZgq9fO.d.mts.map +0 -1
- package/dist/types-Cd-O03VG.d.mts +0 -363
- package/dist/types-Cd-O03VG.d.mts.map +0 -1
- package/dist/types-Cr-Kg-3D.d.mts +0 -1641
- package/dist/types-Cr-Kg-3D.d.mts.map +0 -1
- package/dist/types-D2fvWd1i.d.mts +0 -359
- package/dist/types-D2fvWd1i.d.mts.map +0 -1
- package/dist/types-D7HUsguf.mjs +0 -77
- package/dist/types-D7HUsguf.mjs.map +0 -1
- package/dist/types-DA1Te3Oy.d.mts +0 -198
- package/dist/types-DA1Te3Oy.d.mts.map +0 -1
- package/dist/types-DhV6Q5bP.mjs +0 -18
- package/dist/types-DhV6Q5bP.mjs.map +0 -1
- package/dist/types-DnnVSl6Y.d.mts +0 -85
- package/dist/types-DnnVSl6Y.d.mts.map +0 -1
- package/dist/types-VT4-BugW.mjs +0 -16
- package/dist/types-VT4-BugW.mjs.map +0 -1
- package/dist/upload-attempts-B68ZGNu9.mjs +0 -32
- package/dist/upload-attempts-B68ZGNu9.mjs.map +0 -1
- package/dist/url-pattern-CCeZMGOh.mjs +0 -33
- package/dist/url-pattern-CCeZMGOh.mjs.map +0 -1
- package/dist/user-DDSL-sGw.mjs +0 -171
- package/dist/user-DDSL-sGw.mjs.map +0 -1
- package/dist/utils-DdhmO9w9.mjs +0 -439
- package/dist/utils-DdhmO9w9.mjs.map +0 -1
- package/dist/validate-CHosPEhs.mjs +0 -453
- package/dist/validate-CHosPEhs.mjs.map +0 -1
- package/dist/validate-CM79QXYE.d.mts +0 -432
- package/dist/validate-CM79QXYE.d.mts.map +0 -1
- package/dist/validation-BFecQczG.mjs +0 -218
- package/dist/validation-BFecQczG.mjs.map +0 -1
- package/dist/version-BRZXVifl.mjs +0 -9
- package/dist/version-BRZXVifl.mjs.map +0 -1
- package/dist/version-DXsxRrob.mjs +0 -7
- package/dist/version-DXsxRrob.mjs.map +0 -1
- package/dist/widgets-WdV72brA.mjs +0 -126
- package/dist/widgets-WdV72brA.mjs.map +0 -1
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts +0 -34
- package/dist/wxr-taxonomies-BHTdqkmZ.d.mts.map +0 -1
- package/dist/wxr-taxonomies-DP6ESgMN.mjs +0 -372
- package/dist/wxr-taxonomies-DP6ESgMN.mjs.map +0 -1
- package/dist/zod-generator-D6uE4WiS.mjs +0 -389
- package/dist/zod-generator-D6uE4WiS.mjs.map +0 -1
- package/src/astro/routes/api/relations/[id]/translations.ts +0 -33
- /package/dist/{api-tokens-CE1ECIg0.mjs → api-tokens-FaG1zPsj.mjs} +0 -0
- /package/dist/{ssrf-DpBH7aOt.mjs → ssrf-DZOt8Qof.mjs} +0 -0
package/dist/cli/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as getMigrationStatus, c as formatDatetimeStorageReport, i as getExactMigrationStatus, l as scanDatetimeStorage, s as runMigrations, u as __exportAll } from "../runner-
|
|
2
|
+
import { a as getMigrationStatus, c as formatDatetimeStorageReport, i as getExactMigrationStatus, l as scanDatetimeStorage, s as runMigrations, u as __exportAll } from "../runner-B3eyB9Gb.mjs";
|
|
3
3
|
import { t as EmDashDatabaseError } from "../errors-9P_FDrJ_.mjs";
|
|
4
4
|
import { n as isMissingTableError } from "../db-errors-CBD5yMro.mjs";
|
|
5
5
|
import { busyLockHeldSince, migrationLockHeldMessage } from "../database/migration-lock.mjs";
|
|
@@ -11,64 +11,69 @@ import "../after-PcEvMY_6.mjs";
|
|
|
11
11
|
import { t as OptionsRepository } from "../options-DhrI7eMv.mjs";
|
|
12
12
|
import { a as encodeBase64url } from "../base64-DvnNgP7e.mjs";
|
|
13
13
|
import { n as fingerprintKey, r as generateEncryptionKey, t as EmDashSecretsError } from "../secrets-CIi0nFiR.mjs";
|
|
14
|
-
import { t as ContentRepository } from "../content-
|
|
14
|
+
import { t as ContentRepository } from "../content-CbnufDsM.mjs";
|
|
15
15
|
import "../object-cache-CqWNY5uP.mjs";
|
|
16
16
|
import { n as slugify } from "../slugify-T5GHH42D.mjs";
|
|
17
|
-
import "../types-
|
|
18
|
-
import
|
|
19
|
-
import { t as
|
|
20
|
-
import "../
|
|
21
|
-
import "../
|
|
22
|
-
import "../
|
|
23
|
-
import "../
|
|
24
|
-
import "../
|
|
25
|
-
import
|
|
26
|
-
import { t as
|
|
27
|
-
import "../
|
|
28
|
-
import
|
|
17
|
+
import "../types-aOOxRSx6.mjs";
|
|
18
|
+
import "../revision-j1p4-bOj.mjs";
|
|
19
|
+
import { t as MediaRepository } from "../media-BUQePMxP.mjs";
|
|
20
|
+
import { t as TaxonomyRepository } from "../taxonomy-CKDwM61Y.mjs";
|
|
21
|
+
import "../resolve-C0s1E_fH.mjs";
|
|
22
|
+
import "../redirect-D1ArbO85.mjs";
|
|
23
|
+
import "../request-cache-iHRlHx1d.mjs";
|
|
24
|
+
import "../byline-registry-B_EK_TQf.mjs";
|
|
25
|
+
import "../field-defs-cache-CsZctvbu.mjs";
|
|
26
|
+
import { t as BylineRepository } from "../byline-BayaYGoj.mjs";
|
|
27
|
+
import "../staged-C36IWXff.mjs";
|
|
28
|
+
import "../dist-FPR93_xf.mjs";
|
|
29
|
+
import "../fts-manager-CCaZTp8y.mjs";
|
|
30
|
+
import { h as selectTaxonomyDefs, p as parseTaxonomyCollections } from "../loader-CrRPfkHS.mjs";
|
|
29
31
|
import { kyselyLogOption } from "../database/instrumentation.mjs";
|
|
30
|
-
import "../collection-slugs-cache-
|
|
31
|
-
import "../capture-triggers-
|
|
32
|
-
import "../activation-
|
|
33
|
-
import
|
|
34
|
-
import "../
|
|
35
|
-
import
|
|
36
|
-
import "../
|
|
37
|
-
import {
|
|
38
|
-
import "../
|
|
39
|
-
import "../
|
|
40
|
-
import "../block-values-
|
|
41
|
-
import "../
|
|
42
|
-
import "../
|
|
43
|
-
import
|
|
44
|
-
import
|
|
45
|
-
import "../
|
|
46
|
-
import
|
|
47
|
-
import "../
|
|
48
|
-
import {
|
|
49
|
-
import
|
|
50
|
-
import "../
|
|
51
|
-
import
|
|
32
|
+
import "../collection-slugs-cache-CUuiduLq.mjs";
|
|
33
|
+
import "../capture-triggers-DJEoOTOq.mjs";
|
|
34
|
+
import "../activation-PtniBLt9.mjs";
|
|
35
|
+
import "../collection-deletion-CLCdXsnV.mjs";
|
|
36
|
+
import { L as BlockTypeRegistry, n as SchemaRegistry } from "../registry-CFcNCayZ.mjs";
|
|
37
|
+
import "../hash-COVK27Pc.mjs";
|
|
38
|
+
import "../zod-generator-DmTKI-Ig.mjs";
|
|
39
|
+
import { r as isTransferError, t as TransferError } from "../errors-Bt3goF8I.mjs";
|
|
40
|
+
import "../canonical-CcSuuTlH.mjs";
|
|
41
|
+
import { d as sha256Hex, i as createSha256, s as packageDigest } from "../digest-DVZ--cE9.mjs";
|
|
42
|
+
import "../block-values-ACFqgB1D.mjs";
|
|
43
|
+
import "../query-OzMJ6vJP.mjs";
|
|
44
|
+
import "../schema-BAayK46S.mjs";
|
|
45
|
+
import "../relations-Cfaa1fDl.mjs";
|
|
46
|
+
import "../settings-DSfE7wOa.mjs";
|
|
47
|
+
import "../schema-Gqcl-8G4.mjs";
|
|
48
|
+
import "../settings-D5EHi0Tk.mjs";
|
|
49
|
+
import { a as pluginManifestBaseSchema } from "../manifest-schema-Ci2gmd0u.mjs";
|
|
50
|
+
import { i as isDeprecatedCapability, t as CAPABILITY_RENAMES } from "../types-OC5c-edM.mjs";
|
|
51
|
+
import "../ssrf-Dv0_tRpo.mjs";
|
|
52
|
+
import { t as applySeed } from "../apply-Do3KNnUk.mjs";
|
|
53
|
+
import "../ssrf-DZOt8Qof.mjs";
|
|
54
|
+
import { n as validateSeed } from "../validate-CfgRpcjA.mjs";
|
|
55
|
+
import { a as MigrationManifestValidationError, c as normalizeAstroI18n, i as getMigrationIntegrationMetadata, n as MIGRATION_CONFIG_SYMBOL, s as validateMigrationManifest, t as buildMigrationManifest } from "../manifest-builder-BQzCHNgB.mjs";
|
|
56
|
+
import "../identity-NVTOOQyq.mjs";
|
|
57
|
+
import { t as openNodeSqliteDatabase } from "../node-sqlite-compat-pWFw0lcc.mjs";
|
|
52
58
|
import { LocalStorage } from "../storage/local.mjs";
|
|
53
|
-
import { t as convertDataForRead } from "../portable-text-
|
|
59
|
+
import { t as convertDataForRead } from "../portable-text-DXE8ymtD.mjs";
|
|
54
60
|
import { createHeaderAwareFetch, customHeadersInterceptor, getCachedAccessToken, isAccessRedirect, resolveCustomHeaders, runCloudflaredLogin } from "../client/cf-access.mjs";
|
|
55
61
|
import { EmDashApiError, EmDashClient } from "../client/index.mjs";
|
|
56
|
-
import {
|
|
57
|
-
import "../
|
|
58
|
-
import
|
|
59
|
-
import "../
|
|
60
|
-
import "../
|
|
61
|
-
import
|
|
62
|
+
import { r as fileExists$4, t as bundleCommand } from "../bundle-Db1iNMv_.mjs";
|
|
63
|
+
import { a as parseIndexLine, n as unpackSitePackage, o as parseManifest, r as decodeUtf8, t as packSitePackage } from "../tar-DsTXX6ch.mjs";
|
|
64
|
+
import "../kinds-CYmRESWj.mjs";
|
|
65
|
+
import { t as MANIFEST_PATH } from "../paths-d51RFm8M.mjs";
|
|
66
|
+
import "../transformations-C7RQabKQ.mjs";
|
|
67
|
+
import "../version-DgYjhTud.mjs";
|
|
68
|
+
import { r as verifyReceiptDigest } from "../receipt-B-aU4hpJ.mjs";
|
|
62
69
|
import { createRequire } from "node:module";
|
|
63
70
|
import { Kysely, SqliteDialect, sql } from "kysely";
|
|
64
71
|
import { z } from "zod";
|
|
65
72
|
import { ulid } from "ulidx";
|
|
66
|
-
import { extractManifestRoute, extractRouteOptions, isJsonPostRouteContract } from "@emdash-cms/plugin-types";
|
|
67
73
|
import { createGzipDecoder, unpackTar } from "modern-tar";
|
|
68
74
|
import { pathToFileURL } from "node:url";
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
import { basename, dirname, extname, isAbsolute, join, parse, resolve } from "node:path";
|
|
75
|
+
import { access, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
76
|
+
import { basename, dirname, isAbsolute, join, parse, resolve } from "node:path";
|
|
72
77
|
import { createReadStream, createWriteStream, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
73
78
|
import { Readable, Writable } from "node:stream";
|
|
74
79
|
import { defineCommand, runCommand, runMain } from "citty";
|
|
@@ -79,8 +84,6 @@ import { homedir } from "node:os";
|
|
|
79
84
|
import { parse as parse$1, printParseErrorCode } from "jsonc-parser";
|
|
80
85
|
import { parse as parse$2 } from "smol-toml";
|
|
81
86
|
import { createInterface } from "node:readline/promises";
|
|
82
|
-
import { pipeline } from "node:stream/promises";
|
|
83
|
-
import { packTar } from "modern-tar/fs";
|
|
84
87
|
|
|
85
88
|
//#region src/cli/commands/auth.ts
|
|
86
89
|
/**
|
|
@@ -960,7 +963,7 @@ async function readPackageJson$2(cwd) {
|
|
|
960
963
|
return null;
|
|
961
964
|
}
|
|
962
965
|
}
|
|
963
|
-
async function fileExists$
|
|
966
|
+
async function fileExists$3(path) {
|
|
964
967
|
try {
|
|
965
968
|
await access(path);
|
|
966
969
|
return true;
|
|
@@ -1012,7 +1015,7 @@ const devCommand = defineCommand({
|
|
|
1012
1015
|
process.exit(1);
|
|
1013
1016
|
}
|
|
1014
1017
|
const dbPath = resolve(cwd, args.database);
|
|
1015
|
-
if (!await fileExists$
|
|
1018
|
+
if (!await fileExists$3(dbPath)) consola.start("Database not found, initializing...");
|
|
1016
1019
|
const db = createDatabase({ url: `file:${dbPath}` });
|
|
1017
1020
|
try {
|
|
1018
1021
|
consola.start("Checking database migrations...");
|
|
@@ -1051,8 +1054,8 @@ const devCommand = defineCommand({
|
|
|
1051
1054
|
"--port",
|
|
1052
1055
|
args.port
|
|
1053
1056
|
];
|
|
1054
|
-
const pnpmLockExists = await fileExists$
|
|
1055
|
-
const yarnLockExists = await fileExists$
|
|
1057
|
+
const pnpmLockExists = await fileExists$3(resolve(cwd, "pnpm-lock.yaml"));
|
|
1058
|
+
const yarnLockExists = await fileExists$3(resolve(cwd, "yarn.lock"));
|
|
1056
1059
|
let cmd;
|
|
1057
1060
|
let cmdArgs;
|
|
1058
1061
|
if (pnpmLockExists) {
|
|
@@ -1115,7 +1118,7 @@ function triggerFix(configPath) {
|
|
|
1115
1118
|
function mainFix(configPath) {
|
|
1116
1119
|
return configPath.endsWith(".toml") ? MAIN_FIX_TOML : MAIN_FIX_JSONC;
|
|
1117
1120
|
}
|
|
1118
|
-
async function fileExists$
|
|
1121
|
+
async function fileExists$2(path) {
|
|
1119
1122
|
try {
|
|
1120
1123
|
await access(path);
|
|
1121
1124
|
return true;
|
|
@@ -1136,7 +1139,7 @@ function sourcePosition(source, offset) {
|
|
|
1136
1139
|
async function findWranglerConfig(cwd) {
|
|
1137
1140
|
for (const filename of WRANGLER_CONFIG_FILES) {
|
|
1138
1141
|
const path = resolve(cwd, filename);
|
|
1139
|
-
if (await fileExists$
|
|
1142
|
+
if (await fileExists$2(path)) return path;
|
|
1140
1143
|
}
|
|
1141
1144
|
return null;
|
|
1142
1145
|
}
|
|
@@ -1231,7 +1234,7 @@ function printResult(result) {
|
|
|
1231
1234
|
}
|
|
1232
1235
|
async function checkDatabase(dbPath) {
|
|
1233
1236
|
const results = [];
|
|
1234
|
-
if (!await fileExists$
|
|
1237
|
+
if (!await fileExists$2(dbPath)) {
|
|
1235
1238
|
results.push({
|
|
1236
1239
|
name: "database",
|
|
1237
1240
|
status: "fail",
|
|
@@ -1377,6 +1380,7 @@ const doctorCommand = defineCommand({
|
|
|
1377
1380
|
* Export current database schema (and optionally content) as a seed file
|
|
1378
1381
|
*/
|
|
1379
1382
|
const SETTINGS_PREFIX = "site:";
|
|
1383
|
+
const TRAILING_SLASHES = /\/+$/;
|
|
1380
1384
|
const exportSeedCommand = defineCommand({
|
|
1381
1385
|
meta: {
|
|
1382
1386
|
name: "export-seed",
|
|
@@ -1403,6 +1407,11 @@ const exportSeedCommand = defineCommand({
|
|
|
1403
1407
|
type: "boolean",
|
|
1404
1408
|
description: "Pretty print JSON output",
|
|
1405
1409
|
default: true
|
|
1410
|
+
},
|
|
1411
|
+
"media-base-url": {
|
|
1412
|
+
type: "string",
|
|
1413
|
+
description: "Public URL of the site, used to write absolute media URLs",
|
|
1414
|
+
required: false
|
|
1406
1415
|
}
|
|
1407
1416
|
},
|
|
1408
1417
|
async run({ args }) {
|
|
@@ -1422,7 +1431,10 @@ const exportSeedCommand = defineCommand({
|
|
|
1422
1431
|
process.exit(1);
|
|
1423
1432
|
}
|
|
1424
1433
|
try {
|
|
1425
|
-
const seed = await exportSeed(db, args["with-content"]
|
|
1434
|
+
const seed = await exportSeed(db, args["with-content"], {
|
|
1435
|
+
mediaBaseUrl: args["media-base-url"],
|
|
1436
|
+
warn: (message) => process.stderr.write(`Warning: ${message}\n`)
|
|
1437
|
+
});
|
|
1426
1438
|
const output = args.pretty ? JSON.stringify(seed, null, " ") : JSON.stringify(seed);
|
|
1427
1439
|
console.log(output);
|
|
1428
1440
|
} catch (error) {
|
|
@@ -1436,7 +1448,9 @@ const exportSeedCommand = defineCommand({
|
|
|
1436
1448
|
/**
|
|
1437
1449
|
* Export database to seed file format
|
|
1438
1450
|
*/
|
|
1439
|
-
async function exportSeed(db, withContent) {
|
|
1451
|
+
async function exportSeed(db, withContent, options = {}) {
|
|
1452
|
+
const warn = options.warn ?? (() => {});
|
|
1453
|
+
const mediaUrlPrefix = mediaFileUrlPrefix(options.mediaBaseUrl);
|
|
1440
1454
|
const seed = {
|
|
1441
1455
|
$schema: "https://emdashcms.com/seed.schema.json",
|
|
1442
1456
|
version: "1",
|
|
@@ -1448,19 +1462,46 @@ async function exportSeed(db, withContent) {
|
|
|
1448
1462
|
seed.settings = await exportSettings(db);
|
|
1449
1463
|
seed.blockTypes = await exportBlockTypes(db);
|
|
1450
1464
|
seed.collections = await exportCollections(db);
|
|
1465
|
+
const relations = await exportRelations(db);
|
|
1466
|
+
if (relations.length > 0) seed.relations = relations;
|
|
1451
1467
|
const { i18nEnabled, defaultLocale } = await detectLocaleInfo(db, seed.collections);
|
|
1452
1468
|
if (defaultLocale) seed.defaultLocale = defaultLocale;
|
|
1453
1469
|
seed.taxonomies = await exportTaxonomies(db, i18nEnabled);
|
|
1454
|
-
seed.menus = await exportMenus(db, i18nEnabled);
|
|
1455
|
-
seed.widgetAreas = await exportWidgetAreas(db);
|
|
1456
1470
|
const { bylines, groupToSeedId } = await exportBylines(db);
|
|
1457
|
-
|
|
1471
|
+
let exportedContent;
|
|
1458
1472
|
if (withContent !== void 0) {
|
|
1459
1473
|
const collections = withContent === "" || withContent === "true" || withContent === "all" ? null : withContent.split(",").map((s) => s.trim()).filter(Boolean);
|
|
1460
|
-
|
|
1474
|
+
exportedContent = await exportContent(db, seed.collections || [], collections, groupToSeedId, i18nEnabled, mediaUrlPrefix);
|
|
1475
|
+
}
|
|
1476
|
+
seed.menus = await exportMenus(db, i18nEnabled, exportedContent?.groupSeedIds ?? /* @__PURE__ */ new Map());
|
|
1477
|
+
const redirects = await exportRedirects(db, warn);
|
|
1478
|
+
if (redirects.length > 0) seed.redirects = redirects;
|
|
1479
|
+
seed.widgetAreas = await exportWidgetAreas(db);
|
|
1480
|
+
const sections = await exportSections(db, warn);
|
|
1481
|
+
if (sections.length > 0) seed.sections = sections;
|
|
1482
|
+
if (bylines.length > 0) seed.bylines = bylines;
|
|
1483
|
+
if (exportedContent) {
|
|
1484
|
+
seed.content = exportedContent.content;
|
|
1485
|
+
if (exportedContent.mediaCount > 0 && !options.mediaBaseUrl) warn(`${exportedContent.mediaCount} media reference(s) use site-relative URLs, which \`emdash seed\` cannot download. Pass --media-base-url with the site's public URL to make them importable.`);
|
|
1461
1486
|
}
|
|
1462
1487
|
return seed;
|
|
1463
1488
|
}
|
|
1489
|
+
const MEDIA_FILE_PATH = "/_emdash/api/media/file/";
|
|
1490
|
+
/**
|
|
1491
|
+
* Prefix for `$media` URLs: the site's base URL (without a trailing slash)
|
|
1492
|
+
* plus the public media route, or the bare route when no base is given.
|
|
1493
|
+
*/
|
|
1494
|
+
function mediaFileUrlPrefix(mediaBaseUrl) {
|
|
1495
|
+
if (mediaBaseUrl === void 0) return MEDIA_FILE_PATH;
|
|
1496
|
+
let base;
|
|
1497
|
+
try {
|
|
1498
|
+
base = new URL(mediaBaseUrl);
|
|
1499
|
+
} catch {
|
|
1500
|
+
throw new Error(`Invalid media base URL: ${mediaBaseUrl}`);
|
|
1501
|
+
}
|
|
1502
|
+
if (base.protocol !== "http:" && base.protocol !== "https:") throw new Error(`Media base URL must use http or https: ${mediaBaseUrl}`);
|
|
1503
|
+
return `${base.origin}${base.pathname.replace(TRAILING_SLASHES, "")}${MEDIA_FILE_PATH}`;
|
|
1504
|
+
}
|
|
1464
1505
|
/**
|
|
1465
1506
|
* Export byline profiles as root-level `bylines[]`.
|
|
1466
1507
|
*
|
|
@@ -1508,7 +1549,7 @@ async function exportBylines(db) {
|
|
|
1508
1549
|
* Determine locale-awareness and the data's default locale for the export.
|
|
1509
1550
|
*
|
|
1510
1551
|
* The runtime initializes the i18n config in middleware, but the CLI never does,
|
|
1511
|
-
* so `isI18nEnabled()` is always false under `emdash export-seed
|
|
1552
|
+
* so `isI18nEnabled()` is always false under `emdash export-seed`. When
|
|
1512
1553
|
* the flag is unset, fall back to the data: a project is multi-locale when its
|
|
1513
1554
|
* i18n-aware tables hold rows in more than one distinct locale. `locale` is
|
|
1514
1555
|
* NOT NULL (defaulting to the site's default locale), so a per-row presence
|
|
@@ -1518,7 +1559,7 @@ async function exportBylines(db) {
|
|
|
1518
1559
|
* per-locale suffix they need to avoid duplicate seed ids.
|
|
1519
1560
|
*
|
|
1520
1561
|
* `defaultLocale` self-describes the single-locale case so a non-`en` default
|
|
1521
|
-
* survives the round-trip
|
|
1562
|
+
* survives the round-trip. When more than one locale is present every
|
|
1522
1563
|
* row already carries its own `locale`, so no fallback is needed and we leave it
|
|
1523
1564
|
* undefined rather than guess which locale is the "default" without the runtime
|
|
1524
1565
|
* config.
|
|
@@ -1600,6 +1641,9 @@ async function exportCollections(db) {
|
|
|
1600
1641
|
hidden: collection.hidden || void 0,
|
|
1601
1642
|
sortOrder: collection.sortOrder,
|
|
1602
1643
|
group: collection.group,
|
|
1644
|
+
commentsEnabled: collection.commentsEnabled || void 0,
|
|
1645
|
+
titleField: collection.titleField,
|
|
1646
|
+
dateField: collection.dateField,
|
|
1603
1647
|
fields: fields.map((field) => ({
|
|
1604
1648
|
slug: field.slug,
|
|
1605
1649
|
label: field.label,
|
|
@@ -1608,6 +1652,7 @@ async function exportCollections(db) {
|
|
|
1608
1652
|
unique: field.unique || void 0,
|
|
1609
1653
|
searchable: field.searchable || void 0,
|
|
1610
1654
|
indexed: field.indexed || void 0,
|
|
1655
|
+
translatable: field.translatable === false ? false : void 0,
|
|
1611
1656
|
defaultValue: field.defaultValue,
|
|
1612
1657
|
validation: field.validation ? { ...field.validation } : void 0,
|
|
1613
1658
|
widget: field.widget || void 0,
|
|
@@ -1619,6 +1664,36 @@ async function exportCollections(db) {
|
|
|
1619
1664
|
return result;
|
|
1620
1665
|
}
|
|
1621
1666
|
/**
|
|
1667
|
+
* Export relations as root-level `relations[]`.
|
|
1668
|
+
*
|
|
1669
|
+
* A reference field's `validation.relation` names a relation by slug, and the
|
|
1670
|
+
* field's validation is exported verbatim, so re-applying the seed binds the
|
|
1671
|
+
* field to this relation rather than creating another one.
|
|
1672
|
+
*/
|
|
1673
|
+
async function exportRelations(db) {
|
|
1674
|
+
return (await db.selectFrom("_emdash_relations").select([
|
|
1675
|
+
"slug",
|
|
1676
|
+
"parent_collection",
|
|
1677
|
+
"child_collection",
|
|
1678
|
+
"parent_label",
|
|
1679
|
+
"parent_label_singular",
|
|
1680
|
+
"child_label",
|
|
1681
|
+
"child_label_singular",
|
|
1682
|
+
"max_children_per_parent",
|
|
1683
|
+
"max_parents_per_child"
|
|
1684
|
+
]).orderBy("slug", "asc").execute()).map((row) => ({
|
|
1685
|
+
slug: row.slug,
|
|
1686
|
+
parentCollection: row.parent_collection,
|
|
1687
|
+
childCollection: row.child_collection,
|
|
1688
|
+
parentLabel: row.parent_label,
|
|
1689
|
+
parentLabelSingular: row.parent_label_singular ?? void 0,
|
|
1690
|
+
childLabel: row.child_label,
|
|
1691
|
+
childLabelSingular: row.child_label_singular ?? void 0,
|
|
1692
|
+
maxChildrenPerParent: row.max_children_per_parent,
|
|
1693
|
+
maxParentsPerChild: row.max_parents_per_child
|
|
1694
|
+
}));
|
|
1695
|
+
}
|
|
1696
|
+
/**
|
|
1622
1697
|
* Export taxonomy definitions and terms
|
|
1623
1698
|
*/
|
|
1624
1699
|
async function exportTaxonomies(db, i18nEnabled) {
|
|
@@ -1678,7 +1753,7 @@ async function exportTaxonomies(db, i18nEnabled) {
|
|
|
1678
1753
|
/**
|
|
1679
1754
|
* Export menus with their items
|
|
1680
1755
|
*/
|
|
1681
|
-
async function exportMenus(db, i18nEnabled) {
|
|
1756
|
+
async function exportMenus(db, i18nEnabled, contentGroupSeedIds) {
|
|
1682
1757
|
const menus = await db.selectFrom("_emdash_menus").selectAll().orderBy("name").orderBy("locale").execute();
|
|
1683
1758
|
const result = [];
|
|
1684
1759
|
const groupToSeedId = /* @__PURE__ */ new Map();
|
|
@@ -1691,7 +1766,8 @@ async function exportMenus(db, i18nEnabled) {
|
|
|
1691
1766
|
menuName: menu.name,
|
|
1692
1767
|
menuLocale: menu.locale ?? null,
|
|
1693
1768
|
itemGroupToSeedId,
|
|
1694
|
-
usedItemSeedIds
|
|
1769
|
+
usedItemSeedIds,
|
|
1770
|
+
contentGroupSeedIds
|
|
1695
1771
|
});
|
|
1696
1772
|
const seedMenu = {
|
|
1697
1773
|
id: seedId,
|
|
@@ -1746,7 +1822,7 @@ function buildMenuItemTree(items, i18nCtx) {
|
|
|
1746
1822
|
};
|
|
1747
1823
|
if (item.type === "custom") seedItem.url = item.custom_url || void 0;
|
|
1748
1824
|
else {
|
|
1749
|
-
seedItem.ref = item.reference_id || void 0;
|
|
1825
|
+
seedItem.ref = (item.type !== "taxonomy" && item.reference_id ? i18nCtx.contentGroupSeedIds.get(item.reference_id) : void 0) ?? (item.reference_id || void 0);
|
|
1750
1826
|
seedItem.collection = item.reference_collection || void 0;
|
|
1751
1827
|
}
|
|
1752
1828
|
if (item.target === "_blank") seedItem.target = "_blank";
|
|
@@ -1797,27 +1873,129 @@ async function exportWidgetAreas(db) {
|
|
|
1797
1873
|
}
|
|
1798
1874
|
return result;
|
|
1799
1875
|
}
|
|
1800
|
-
|
|
1801
|
-
|
|
1876
|
+
function isSeedRedirectType(type) {
|
|
1877
|
+
return type === 301 || type === 302 || type === 307 || type === 308;
|
|
1878
|
+
}
|
|
1879
|
+
/**
|
|
1880
|
+
* Export redirect rules. Terminal rules (410/451) have no seed representation
|
|
1881
|
+
* and are reported through `warn` instead.
|
|
1882
|
+
*
|
|
1883
|
+
* Databases migrated from before the source guard can hold several rows for
|
|
1884
|
+
* one source; only the guarded row is exported, since a seed rejects duplicate
|
|
1885
|
+
* sources.
|
|
1886
|
+
*/
|
|
1887
|
+
async function exportRedirects(db, warn) {
|
|
1888
|
+
const rows = await db.selectFrom("_emdash_redirects").select([
|
|
1889
|
+
"source",
|
|
1890
|
+
"destination",
|
|
1891
|
+
"type",
|
|
1892
|
+
"enabled",
|
|
1893
|
+
"group_name",
|
|
1894
|
+
"source_guard"
|
|
1895
|
+
]).orderBy("created_at").orderBy("id").execute();
|
|
1896
|
+
const guardedRows = /* @__PURE__ */ new Map();
|
|
1897
|
+
for (const row of rows) {
|
|
1898
|
+
const current = guardedRows.get(row.source);
|
|
1899
|
+
if (!current || row.source_guard === 1 && current.source_guard !== 1) guardedRows.set(row.source, row);
|
|
1900
|
+
}
|
|
1901
|
+
const result = [];
|
|
1902
|
+
for (const row of rows) {
|
|
1903
|
+
if (guardedRows.get(row.source) !== row) {
|
|
1904
|
+
warn(`Skipping duplicate rule for "${row.source}" -> "${row.destination}".`);
|
|
1905
|
+
continue;
|
|
1906
|
+
}
|
|
1907
|
+
if (!isSeedRedirectType(row.type)) {
|
|
1908
|
+
warn(`Skipping ${row.type} rule for "${row.source}": seeds only carry 301/302/307/308.`);
|
|
1909
|
+
continue;
|
|
1910
|
+
}
|
|
1911
|
+
const redirect = {
|
|
1912
|
+
source: row.source,
|
|
1913
|
+
destination: row.destination,
|
|
1914
|
+
type: row.type
|
|
1915
|
+
};
|
|
1916
|
+
if (row.enabled === 0) redirect.enabled = false;
|
|
1917
|
+
if (row.group_name) redirect.groupName = row.group_name;
|
|
1918
|
+
result.push(redirect);
|
|
1919
|
+
}
|
|
1920
|
+
return result;
|
|
1921
|
+
}
|
|
1922
|
+
function isSeedSectionSource(source) {
|
|
1923
|
+
return source === "theme" || source === "user" || source === "import";
|
|
1924
|
+
}
|
|
1925
|
+
/** Section slugs a seed accepts. The WordPress importer can store others. */
|
|
1926
|
+
const SEED_SECTION_SLUG_PATTERN = /^[a-z0-9-]+$/;
|
|
1927
|
+
async function exportSections(db, warn) {
|
|
1928
|
+
const rows = await db.selectFrom("_emdash_sections").select([
|
|
1929
|
+
"slug",
|
|
1930
|
+
"title",
|
|
1931
|
+
"description",
|
|
1932
|
+
"keywords",
|
|
1933
|
+
"content",
|
|
1934
|
+
"source"
|
|
1935
|
+
]).orderBy("slug").execute();
|
|
1936
|
+
const result = [];
|
|
1937
|
+
for (const row of rows) {
|
|
1938
|
+
if (!SEED_SECTION_SLUG_PATTERN.test(row.slug)) {
|
|
1939
|
+
warn(`Skipping section "${row.slug}": seed section slugs may only contain lowercase letters, digits, and hyphens.`);
|
|
1940
|
+
continue;
|
|
1941
|
+
}
|
|
1942
|
+
const section = {
|
|
1943
|
+
slug: row.slug,
|
|
1944
|
+
title: row.title,
|
|
1945
|
+
content: JSON.parse(row.content)
|
|
1946
|
+
};
|
|
1947
|
+
if (row.description) section.description = row.description;
|
|
1948
|
+
if (row.keywords) section.keywords = JSON.parse(row.keywords);
|
|
1949
|
+
if (isSeedSectionSource(row.source)) section.source = row.source;
|
|
1950
|
+
result.push(section);
|
|
1951
|
+
}
|
|
1952
|
+
return result;
|
|
1953
|
+
}
|
|
1954
|
+
async function loadRelations(db) {
|
|
1955
|
+
const rows = await db.selectFrom("_emdash_relations").select([
|
|
1956
|
+
"id",
|
|
1957
|
+
"slug",
|
|
1958
|
+
"child_collection",
|
|
1959
|
+
"max_children_per_parent"
|
|
1960
|
+
]).execute();
|
|
1961
|
+
return new Map(rows.map((row) => [row.slug, {
|
|
1962
|
+
id: row.id,
|
|
1963
|
+
childCollection: row.child_collection,
|
|
1964
|
+
maxChildrenPerParent: row.max_children_per_parent
|
|
1965
|
+
}]));
|
|
1966
|
+
}
|
|
1967
|
+
/** A legacy reference column holds a single entry id or an array of them. */
|
|
1968
|
+
function legacyReferenceValues(value) {
|
|
1802
1969
|
if (typeof value === "string") return [value];
|
|
1803
1970
|
if (Array.isArray(value)) return value.filter((v) => typeof v === "string");
|
|
1804
1971
|
return [];
|
|
1805
1972
|
}
|
|
1806
1973
|
/**
|
|
1807
1974
|
* For each exported collection, the other exported collections its entries
|
|
1808
|
-
* point into.
|
|
1809
|
-
*
|
|
1975
|
+
* point into.
|
|
1976
|
+
*
|
|
1977
|
+
* A field bound to a relation names its target in the relation, and its links
|
|
1978
|
+
* are not in `data` to be read. A field with no relation still holds entry ids
|
|
1979
|
+
* in its own column; those are read from the values rather than from a declared
|
|
1980
|
+
* target, so a field without `options.collection` is still accounted for.
|
|
1810
1981
|
*/
|
|
1811
|
-
function referenceTargets(collected, collectionsBySlug, entryIdToCollection) {
|
|
1982
|
+
function referenceTargets(collected, collectionsBySlug, entryIdToCollection, relations) {
|
|
1812
1983
|
const targets = /* @__PURE__ */ new Map();
|
|
1813
1984
|
for (const [slug, items] of collected) {
|
|
1814
|
-
const referenceFields = (collectionsBySlug.get(slug)?.fields ?? []).filter((field) => field.type === "reference")
|
|
1985
|
+
const referenceFields = (collectionsBySlug.get(slug)?.fields ?? []).filter((field) => field.type === "reference");
|
|
1815
1986
|
if (referenceFields.length === 0) continue;
|
|
1816
1987
|
const found = /* @__PURE__ */ new Set();
|
|
1817
|
-
|
|
1818
|
-
const target = entryIdToCollection.get(value);
|
|
1988
|
+
const add = (target) => {
|
|
1819
1989
|
if (target && target !== slug) found.add(target);
|
|
1820
|
-
}
|
|
1990
|
+
};
|
|
1991
|
+
for (const field of referenceFields) {
|
|
1992
|
+
const relationSlug = field.validation?.relation;
|
|
1993
|
+
if (typeof relationSlug !== "string") continue;
|
|
1994
|
+
if (field.validation?.relationSide === "child") continue;
|
|
1995
|
+
add(relations.get(relationSlug)?.childCollection);
|
|
1996
|
+
}
|
|
1997
|
+
const columnFields = referenceFields.filter((field) => typeof field.validation?.relation !== "string").map((field) => field.slug);
|
|
1998
|
+
if (columnFields.length > 0) for (const { item } of items) for (const fieldSlug of columnFields) for (const value of legacyReferenceValues(item.data[fieldSlug])) add(entryIdToCollection.get(value));
|
|
1821
1999
|
if (found.size > 0) targets.set(slug, found);
|
|
1822
2000
|
}
|
|
1823
2001
|
return targets;
|
|
@@ -1851,8 +2029,9 @@ function orderByReferenceTargets(slugs, targets) {
|
|
|
1851
2029
|
/**
|
|
1852
2030
|
* Export content from collections
|
|
1853
2031
|
*/
|
|
1854
|
-
async function exportContent(db, collections, includeCollections, bylineGroupToSeedId, i18nEnabled) {
|
|
2032
|
+
async function exportContent(db, collections, includeCollections, bylineGroupToSeedId, i18nEnabled, mediaUrlPrefix) {
|
|
1855
2033
|
const content = {};
|
|
2034
|
+
const mediaCounter = { count: 0 };
|
|
1856
2035
|
const contentRepo = new ContentRepository(db);
|
|
1857
2036
|
const taxonomyRepo = new TaxonomyRepository(db);
|
|
1858
2037
|
const mediaRepo = new MediaRepository(db);
|
|
@@ -1866,7 +2045,7 @@ async function exportContent(db, collections, includeCollections, bylineGroupToS
|
|
|
1866
2045
|
status: "all"
|
|
1867
2046
|
});
|
|
1868
2047
|
for (const media of result.items) mediaMap.set(media.id, {
|
|
1869
|
-
url:
|
|
2048
|
+
url: `${mediaUrlPrefix}${media.storageKey}`,
|
|
1870
2049
|
filename: media.filename,
|
|
1871
2050
|
alt: media.alt || void 0,
|
|
1872
2051
|
caption: media.caption || void 0
|
|
@@ -1877,6 +2056,8 @@ async function exportContent(db, collections, includeCollections, bylineGroupToS
|
|
|
1877
2056
|
const collected = /* @__PURE__ */ new Map();
|
|
1878
2057
|
const entryIdToSeedId = /* @__PURE__ */ new Map();
|
|
1879
2058
|
const entryIdToCollection = /* @__PURE__ */ new Map();
|
|
2059
|
+
const groupToSeedId = /* @__PURE__ */ new Map();
|
|
2060
|
+
const exported = [];
|
|
1880
2061
|
for (const collection of collections) {
|
|
1881
2062
|
if (includeCollections && !includeCollections.includes(collection.slug)) continue;
|
|
1882
2063
|
const items = [];
|
|
@@ -1894,13 +2075,16 @@ async function exportContent(db, collections, includeCollections, bylineGroupToS
|
|
|
1894
2075
|
});
|
|
1895
2076
|
entryIdToSeedId.set(item.id, seedId);
|
|
1896
2077
|
entryIdToCollection.set(item.id, collection.slug);
|
|
2078
|
+
const group = item.translationGroup ?? item.id;
|
|
2079
|
+
if (!groupToSeedId.has(group)) groupToSeedId.set(group, seedId);
|
|
1897
2080
|
}
|
|
1898
2081
|
cursor = result.nextCursor;
|
|
1899
2082
|
} while (cursor);
|
|
1900
2083
|
collected.set(collection.slug, items);
|
|
1901
2084
|
}
|
|
2085
|
+
const relations = await loadRelations(db);
|
|
1902
2086
|
const collectionsBySlug = new Map(collections.map((c) => [c.slug, c]));
|
|
1903
|
-
const orderedSlugs = orderByReferenceTargets([...collected.keys()], referenceTargets(collected, collectionsBySlug, entryIdToCollection));
|
|
2087
|
+
const orderedSlugs = orderByReferenceTargets([...collected.keys()], referenceTargets(collected, collectionsBySlug, entryIdToCollection, relations));
|
|
1904
2088
|
for (const slug of orderedSlugs) {
|
|
1905
2089
|
const collection = collectionsBySlug.get(slug);
|
|
1906
2090
|
const items = collected.get(slug);
|
|
@@ -1908,11 +2092,11 @@ async function exportContent(db, collections, includeCollections, bylineGroupToS
|
|
|
1908
2092
|
const entries = [];
|
|
1909
2093
|
const translationGroupToSeedId = /* @__PURE__ */ new Map();
|
|
1910
2094
|
for (const { item, seedId } of items) {
|
|
1911
|
-
const processedData = processDataForExport(item.data, collection.fields, mediaMap,
|
|
2095
|
+
const processedData = processDataForExport(item.data, collection.fields, mediaMap, mediaCounter);
|
|
1912
2096
|
const entry = {
|
|
1913
2097
|
id: seedId,
|
|
1914
2098
|
slug: item.slug?.trim() ? item.slug : collection.routable === false ? void 0 : item.id,
|
|
1915
|
-
status: item.status === "published"
|
|
2099
|
+
status: item.status === "published" ? "published" : "draft",
|
|
1916
2100
|
data: processedData
|
|
1917
2101
|
};
|
|
1918
2102
|
if (i18nEnabled && item.locale) {
|
|
@@ -1927,6 +2111,12 @@ async function exportContent(db, collections, includeCollections, bylineGroupToS
|
|
|
1927
2111
|
if (Object.keys(taxonomies).length > 0) entry.taxonomies = taxonomies;
|
|
1928
2112
|
const bylines = await getBylineCredits(db, collection.slug, item.id, bylineGroupToSeedId);
|
|
1929
2113
|
if (bylines.length > 0) entry.bylines = bylines;
|
|
2114
|
+
exported.push({
|
|
2115
|
+
collection,
|
|
2116
|
+
entry,
|
|
2117
|
+
translationGroup: item.translationGroup ?? null,
|
|
2118
|
+
referenceValues: item.data
|
|
2119
|
+
});
|
|
1930
2120
|
entries.push(entry);
|
|
1931
2121
|
}
|
|
1932
2122
|
if (i18nEnabled && entries.length > 0) entries.sort((a, b) => {
|
|
@@ -1936,37 +2126,110 @@ async function exportContent(db, collections, includeCollections, bylineGroupToS
|
|
|
1936
2126
|
});
|
|
1937
2127
|
if (entries.length > 0) content[collection.slug] = entries;
|
|
1938
2128
|
}
|
|
1939
|
-
|
|
2129
|
+
await addReferenceLinks(db, exported, relations, groupToSeedId, entryIdToSeedId);
|
|
2130
|
+
return {
|
|
2131
|
+
content,
|
|
2132
|
+
groupSeedIds: groupToSeedId,
|
|
2133
|
+
mediaCount: mediaCounter.count
|
|
2134
|
+
};
|
|
2135
|
+
}
|
|
2136
|
+
/**
|
|
2137
|
+
* Write each entry's reference selection into its `data` as `$ref:` values, which
|
|
2138
|
+
* the seed's own content ids resolve on apply.
|
|
2139
|
+
*
|
|
2140
|
+
* A field bound to a relation takes its selection from the link table. Only the
|
|
2141
|
+
* parent side is emitted: both sides view one link set, so a child-side field
|
|
2142
|
+
* would restate links the parent side already carries, and `setReferenceChildren`
|
|
2143
|
+
* accepts them only from the parent. A field with no relation takes the entry id
|
|
2144
|
+
* in its column instead.
|
|
2145
|
+
*
|
|
2146
|
+
* Runs after every collection has been emitted, so the seed id of any target is
|
|
2147
|
+
* known. A target that was not exported has none: a link is then dropped, since
|
|
2148
|
+
* nothing in the seed owns it, while a column value keeps its `$ref:` prefix
|
|
2149
|
+
* around the raw row id. Stripping the prefix there would write a row id that no
|
|
2150
|
+
* restored row carries into the column, and the restore would report success.
|
|
2151
|
+
*/
|
|
2152
|
+
async function addReferenceLinks(db, exported, relations, groupToSeedId, entryIdToSeedId) {
|
|
2153
|
+
if (exported.length === 0) return;
|
|
2154
|
+
const linksByRelation = /* @__PURE__ */ new Map();
|
|
2155
|
+
if (relations.size > 0) {
|
|
2156
|
+
const edges = await db.selectFrom("_emdash_content_references").select([
|
|
2157
|
+
"relation_id",
|
|
2158
|
+
"parent_group",
|
|
2159
|
+
"child_group"
|
|
2160
|
+
]).orderBy("sort_order", "asc").execute();
|
|
2161
|
+
for (const edge of edges) {
|
|
2162
|
+
const byParent = linksByRelation.get(edge.relation_id) ?? /* @__PURE__ */ new Map();
|
|
2163
|
+
const children = byParent.get(edge.parent_group) ?? [];
|
|
2164
|
+
children.push(edge.child_group);
|
|
2165
|
+
byParent.set(edge.parent_group, children);
|
|
2166
|
+
linksByRelation.set(edge.relation_id, byParent);
|
|
2167
|
+
}
|
|
2168
|
+
}
|
|
2169
|
+
for (const { collection, entry, translationGroup, referenceValues } of exported) for (const field of collection.fields) {
|
|
2170
|
+
if (field.type !== "reference") continue;
|
|
2171
|
+
const slug = field.validation?.relation;
|
|
2172
|
+
if (typeof slug !== "string") {
|
|
2173
|
+
const stored = referenceValues[field.slug];
|
|
2174
|
+
const refs = (Array.isArray(stored) ? stored : [stored]).filter((id) => typeof id === "string" && id.length > 0).map((id) => `$ref:${entryIdToSeedId.get(id) ?? id}`);
|
|
2175
|
+
if (refs.length === 0) continue;
|
|
2176
|
+
entry.data[field.slug] = Array.isArray(stored) ? refs : refs[0];
|
|
2177
|
+
continue;
|
|
2178
|
+
}
|
|
2179
|
+
if (field.validation?.relationSide === "child") continue;
|
|
2180
|
+
const relation = relations.get(slug);
|
|
2181
|
+
if (!relation || !translationGroup) continue;
|
|
2182
|
+
const refs = (linksByRelation.get(relation.id)?.get(translationGroup) ?? []).map((group) => groupToSeedId.get(group)).filter((seedId) => seedId !== void 0).map((seedId) => `$ref:${seedId}`);
|
|
2183
|
+
if (refs.length === 0) continue;
|
|
2184
|
+
entry.data[field.slug] = relation.maxChildrenPerParent === 1 ? refs[0] : refs;
|
|
2185
|
+
}
|
|
2186
|
+
}
|
|
2187
|
+
/**
|
|
2188
|
+
* Convert a stored media value (image or file) to `$media` syntax. Values that
|
|
2189
|
+
* don't point at a known media row are kept as they are.
|
|
2190
|
+
*/
|
|
2191
|
+
function toSeedMedia(value, mediaMap, mediaCounter) {
|
|
2192
|
+
if (!value || typeof value !== "object") return value;
|
|
2193
|
+
const mediaValue = value;
|
|
2194
|
+
const mediaInfo = typeof mediaValue.id === "string" ? mediaMap.get(mediaValue.id) : void 0;
|
|
2195
|
+
if (!mediaInfo) return value;
|
|
2196
|
+
mediaCounter.count++;
|
|
2197
|
+
return { $media: {
|
|
2198
|
+
url: mediaInfo.url,
|
|
2199
|
+
filename: mediaInfo.filename,
|
|
2200
|
+
alt: typeof mediaValue.alt === "string" && mediaValue.alt || mediaInfo.alt,
|
|
2201
|
+
caption: mediaInfo.caption
|
|
2202
|
+
} };
|
|
2203
|
+
}
|
|
2204
|
+
/** Slugs of a repeater field's `image` sub-fields. */
|
|
2205
|
+
function repeaterImageSubFields(field) {
|
|
2206
|
+
const subFields = field.validation?.subFields;
|
|
2207
|
+
const slugs = /* @__PURE__ */ new Set();
|
|
2208
|
+
if (!Array.isArray(subFields)) return slugs;
|
|
2209
|
+
for (const subField of subFields) if (subField && typeof subField === "object" && subField.type === "image" && typeof subField.slug === "string") slugs.add(subField.slug);
|
|
2210
|
+
return slugs;
|
|
1940
2211
|
}
|
|
1941
2212
|
/**
|
|
1942
|
-
* Process content data for export
|
|
2213
|
+
* Process content data for export: media values become `$media` references
|
|
2214
|
+
* and reference values become `$ref:` seed ids.
|
|
1943
2215
|
*/
|
|
1944
|
-
function processDataForExport(data, fields, mediaMap,
|
|
2216
|
+
function processDataForExport(data, fields, mediaMap, mediaCounter) {
|
|
1945
2217
|
const result = {};
|
|
1946
|
-
const
|
|
1947
|
-
for (const field of fields)
|
|
2218
|
+
const fieldsBySlug = /* @__PURE__ */ new Map();
|
|
2219
|
+
for (const field of fields) fieldsBySlug.set(field.slug, field);
|
|
1948
2220
|
for (const [key, value] of Object.entries(data)) {
|
|
1949
|
-
const
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
continue;
|
|
1962
|
-
}
|
|
1963
|
-
}
|
|
1964
|
-
result[key] = value;
|
|
1965
|
-
} else if (fieldType === "reference" && typeof value === "string") result[key] = `$ref:${entryIdToSeedId.get(value) ?? value}`;
|
|
1966
|
-
else if (Array.isArray(value)) result[key] = value.map((item) => {
|
|
1967
|
-
if (typeof item === "string" && fieldType === "reference") return `$ref:${entryIdToSeedId.get(item) ?? item}`;
|
|
1968
|
-
return item;
|
|
1969
|
-
});
|
|
2221
|
+
const field = fieldsBySlug.get(key);
|
|
2222
|
+
const fieldType = field?.type;
|
|
2223
|
+
if (fieldType === "image" || fieldType === "file") result[key] = toSeedMedia(value, mediaMap, mediaCounter);
|
|
2224
|
+
else if (field && fieldType === "repeater" && Array.isArray(value)) {
|
|
2225
|
+
const imageSubFields = repeaterImageSubFields(field);
|
|
2226
|
+
result[key] = value.map((row) => {
|
|
2227
|
+
if (!row || typeof row !== "object" || Array.isArray(row)) return row;
|
|
2228
|
+
const exportedRow = {};
|
|
2229
|
+
for (const [subKey, subValue] of Object.entries(row)) exportedRow[subKey] = imageSubFields.has(subKey) ? toSeedMedia(subValue, mediaMap, mediaCounter) : subValue;
|
|
2230
|
+
return exportedRow;
|
|
2231
|
+
});
|
|
2232
|
+
} else if (fieldType === "reference") continue;
|
|
1970
2233
|
else result[key] = value;
|
|
1971
2234
|
}
|
|
1972
2235
|
return result;
|
|
@@ -2011,7 +2274,7 @@ async function getTaxonomyAssignments(taxonomyRepo, collection, entryId) {
|
|
|
2011
2274
|
*
|
|
2012
2275
|
* Initialize database from template config in package.json
|
|
2013
2276
|
*/
|
|
2014
|
-
async function fileExists$
|
|
2277
|
+
async function fileExists$1(path) {
|
|
2015
2278
|
try {
|
|
2016
2279
|
await access(path);
|
|
2017
2280
|
return true;
|
|
@@ -2102,7 +2365,7 @@ const initCommand = defineCommand({
|
|
|
2102
2365
|
if (alreadyInitialized && args.force) consola.warn("Re-initializing (--force)...");
|
|
2103
2366
|
if (config?.schema) {
|
|
2104
2367
|
const schemaPath = resolve(cwd, config.schema);
|
|
2105
|
-
if (await fileExists$
|
|
2368
|
+
if (await fileExists$1(schemaPath)) {
|
|
2106
2369
|
consola.start(`Running schema: ${config.schema}`);
|
|
2107
2370
|
try {
|
|
2108
2371
|
await runSqlFile(db, schemaPath);
|
|
@@ -3303,656 +3566,6 @@ const migrateCommand = defineCommand({
|
|
|
3303
3566
|
}
|
|
3304
3567
|
});
|
|
3305
3568
|
|
|
3306
|
-
//#endregion
|
|
3307
|
-
//#region src/cli/commands/bundle-utils.ts
|
|
3308
|
-
/**
|
|
3309
|
-
* Bundle utility functions
|
|
3310
|
-
*
|
|
3311
|
-
* Shared logic extracted from the bundle command so it can be tested
|
|
3312
|
-
* without the CLI harness and tsdown dependency.
|
|
3313
|
-
*/
|
|
3314
|
-
const MAX_BUNDLE_SIZE = 256 * 1024;
|
|
3315
|
-
const MAX_FILE_SIZE = 128 * 1024;
|
|
3316
|
-
const MAX_FILE_COUNT = 20;
|
|
3317
|
-
const MAX_SCREENSHOTS = 5;
|
|
3318
|
-
const MAX_SCREENSHOT_WIDTH = 1920;
|
|
3319
|
-
const MAX_SCREENSHOT_HEIGHT = 1080;
|
|
3320
|
-
const ICON_SIZE = 256;
|
|
3321
|
-
const MCP_TOOL_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
3322
|
-
/**
|
|
3323
|
-
* Matches Node.js built-in imports in bundled output:
|
|
3324
|
-
* - require("node:xxx") / require("xxx")
|
|
3325
|
-
* - import("node:xxx") / import("xxx")
|
|
3326
|
-
* - import X from "node:xxx" / import { X } from "node:xxx"
|
|
3327
|
-
* - import * as X from "node:xxx"
|
|
3328
|
-
* - export { X } from "node:xxx"
|
|
3329
|
-
* Captures the base module name (e.g. "fs" from "node:fs/promises").
|
|
3330
|
-
*/
|
|
3331
|
-
const NODE_BUILTIN_IMPORT_RE = /(?:import|export|require)\s*(?:\(|[^(]*?\bfrom\s+)["'](?:node:)?([a-z_]+)(?:\/[^"']*)?\s*["']\)?/g;
|
|
3332
|
-
const LEADING_DOT_SLASH_RE = /^\.\//;
|
|
3333
|
-
const DIST_PREFIX_RE = /^dist\//;
|
|
3334
|
-
const MJS_EXT_RE = /\.m?js$/;
|
|
3335
|
-
const TS_TO_TSX_RE = /\.ts$/;
|
|
3336
|
-
/** Node.js built-in modules that shouldn't appear in sandbox code */
|
|
3337
|
-
const NODE_BUILTINS = new Set([
|
|
3338
|
-
"assert",
|
|
3339
|
-
"buffer",
|
|
3340
|
-
"child_process",
|
|
3341
|
-
"cluster",
|
|
3342
|
-
"crypto",
|
|
3343
|
-
"dgram",
|
|
3344
|
-
"dns",
|
|
3345
|
-
"domain",
|
|
3346
|
-
"events",
|
|
3347
|
-
"fs",
|
|
3348
|
-
"http",
|
|
3349
|
-
"http2",
|
|
3350
|
-
"https",
|
|
3351
|
-
"inspector",
|
|
3352
|
-
"module",
|
|
3353
|
-
"net",
|
|
3354
|
-
"os",
|
|
3355
|
-
"path",
|
|
3356
|
-
"perf_hooks",
|
|
3357
|
-
"process",
|
|
3358
|
-
"punycode",
|
|
3359
|
-
"querystring",
|
|
3360
|
-
"readline",
|
|
3361
|
-
"repl",
|
|
3362
|
-
"stream",
|
|
3363
|
-
"string_decoder",
|
|
3364
|
-
"sys",
|
|
3365
|
-
"timers",
|
|
3366
|
-
"tls",
|
|
3367
|
-
"trace_events",
|
|
3368
|
-
"tty",
|
|
3369
|
-
"url",
|
|
3370
|
-
"util",
|
|
3371
|
-
"v8",
|
|
3372
|
-
"vm",
|
|
3373
|
-
"wasi",
|
|
3374
|
-
"worker_threads",
|
|
3375
|
-
"zlib"
|
|
3376
|
-
]);
|
|
3377
|
-
async function fileExists$1(path) {
|
|
3378
|
-
try {
|
|
3379
|
-
await access(path);
|
|
3380
|
-
return true;
|
|
3381
|
-
} catch {
|
|
3382
|
-
return false;
|
|
3383
|
-
}
|
|
3384
|
-
}
|
|
3385
|
-
/** Convert an absolute build artifact path into a portable ESM import specifier. */
|
|
3386
|
-
function toFileImportSpecifier(path) {
|
|
3387
|
-
return pathToFileURL(path).href;
|
|
3388
|
-
}
|
|
3389
|
-
/**
|
|
3390
|
-
* Read image dimensions from a buffer.
|
|
3391
|
-
* Returns [width, height] or null if the format is unrecognized.
|
|
3392
|
-
*/
|
|
3393
|
-
function readImageDimensions(buf) {
|
|
3394
|
-
try {
|
|
3395
|
-
const result = imageSize(buf);
|
|
3396
|
-
if (result.width != null && result.height != null) return [result.width, result.height];
|
|
3397
|
-
return null;
|
|
3398
|
-
} catch {
|
|
3399
|
-
return null;
|
|
3400
|
-
}
|
|
3401
|
-
}
|
|
3402
|
-
/**
|
|
3403
|
-
* Extract manifest metadata from a ResolvedPlugin.
|
|
3404
|
-
* Strips functions (hooks, route handlers) and keeps only serializable metadata.
|
|
3405
|
-
*/
|
|
3406
|
-
function extractManifest(plugin) {
|
|
3407
|
-
if ((plugin.admin.pages?.length ?? 0) > 0 || (plugin.admin.widgets?.length ?? 0) > 0) {
|
|
3408
|
-
const adminRoute = plugin.routes.admin;
|
|
3409
|
-
if (adminRoute && (adminRoute.public === true || !isJsonPostRouteContract(adminRoute))) throw new Error("Block Kit admin route must accept POST JSON requests and return JSON");
|
|
3410
|
-
}
|
|
3411
|
-
const declaredAccess = capabilitiesToDeclaredAccess$1(plugin.capabilities, plugin.allowedHosts);
|
|
3412
|
-
const enforcedAccess = declaredAccessToCapabilities$1(declaredAccess);
|
|
3413
|
-
const hooks = [];
|
|
3414
|
-
for (const [name, resolved] of Object.entries(plugin.hooks)) {
|
|
3415
|
-
if (!resolved) continue;
|
|
3416
|
-
if (resolved.exclusive || resolved.priority !== 100 || resolved.timeout !== 5e3) {
|
|
3417
|
-
const entry = { name };
|
|
3418
|
-
if (resolved.exclusive) entry.exclusive = true;
|
|
3419
|
-
if (resolved.priority !== 100) entry.priority = resolved.priority;
|
|
3420
|
-
if (resolved.timeout !== 5e3) entry.timeout = resolved.timeout;
|
|
3421
|
-
hooks.push(entry);
|
|
3422
|
-
} else hooks.push(name);
|
|
3423
|
-
}
|
|
3424
|
-
const routes = Object.entries(plugin.routes).map(([name, route]) => extractManifestRoute(name, route));
|
|
3425
|
-
const tools = Object.entries(plugin.mcp?.tools ?? {}).map(([name, tool]) => {
|
|
3426
|
-
if (!MCP_TOOL_NAME_PATTERN.test(name)) throw new Error(`Invalid MCP tool name "${name}"`);
|
|
3427
|
-
const route = plugin.routes[tool.route];
|
|
3428
|
-
if (!route?.permission || route.public || route.response === "raw") throw new Error(`MCP tool "${name}" must reference a private route with a permission`);
|
|
3429
|
-
if (!isJsonPostRouteContract(route)) throw new Error(`MCP tool "${name}" must reference a POST-compatible JSON route`);
|
|
3430
|
-
return {
|
|
3431
|
-
name,
|
|
3432
|
-
description: tool.description,
|
|
3433
|
-
route: tool.route,
|
|
3434
|
-
permission: route.permission,
|
|
3435
|
-
destructive: tool.destructive ?? false,
|
|
3436
|
-
inputSchema: z.toJSONSchema(tool.input, { target: "draft-7" }),
|
|
3437
|
-
...tool.output ? { outputSchema: z.toJSONSchema(tool.output, { target: "draft-7" }) } : {}
|
|
3438
|
-
};
|
|
3439
|
-
});
|
|
3440
|
-
return {
|
|
3441
|
-
id: plugin.id,
|
|
3442
|
-
version: plugin.version,
|
|
3443
|
-
declaredAccess,
|
|
3444
|
-
capabilities: enforcedAccess.capabilities,
|
|
3445
|
-
allowedHosts: plugin.allowedHosts,
|
|
3446
|
-
storage: plugin.storage,
|
|
3447
|
-
hooks,
|
|
3448
|
-
routes,
|
|
3449
|
-
...tools.length > 0 ? { mcp: { tools } } : {},
|
|
3450
|
-
admin: {
|
|
3451
|
-
settingsSchema: plugin.admin.settingsSchema,
|
|
3452
|
-
pages: plugin.admin.pages,
|
|
3453
|
-
widgets: plugin.admin.widgets,
|
|
3454
|
-
editorPanels: plugin.admin.editorPanels,
|
|
3455
|
-
editorActions: plugin.admin.editorActions
|
|
3456
|
-
}
|
|
3457
|
-
};
|
|
3458
|
-
}
|
|
3459
|
-
/**
|
|
3460
|
-
* Scan bundled code for Node.js built-in imports.
|
|
3461
|
-
* Matches require("node:xxx"), require("xxx"), import("node:xxx") — the patterns
|
|
3462
|
-
* that appear in bundled ESM/CJS output (not source-level named imports).
|
|
3463
|
-
* Returns deduplicated array of built-in module names found.
|
|
3464
|
-
*/
|
|
3465
|
-
function findNodeBuiltinImports(code) {
|
|
3466
|
-
const found = [];
|
|
3467
|
-
NODE_BUILTIN_IMPORT_RE.lastIndex = 0;
|
|
3468
|
-
let match;
|
|
3469
|
-
while ((match = NODE_BUILTIN_IMPORT_RE.exec(code)) !== null) {
|
|
3470
|
-
const mod = match[1];
|
|
3471
|
-
if (NODE_BUILTINS.has(mod)) found.push(mod);
|
|
3472
|
-
}
|
|
3473
|
-
return [...new Set(found)];
|
|
3474
|
-
}
|
|
3475
|
-
/**
|
|
3476
|
-
* Find a build output file by base name, checking common extensions.
|
|
3477
|
-
* tsdown may output .mjs, .js, or .cjs depending on format and config.
|
|
3478
|
-
*/
|
|
3479
|
-
async function findBuildOutput(dir, baseName) {
|
|
3480
|
-
for (const ext of [
|
|
3481
|
-
".mjs",
|
|
3482
|
-
".js",
|
|
3483
|
-
".cjs"
|
|
3484
|
-
]) {
|
|
3485
|
-
const candidate = join(dir, `${baseName}${ext}`);
|
|
3486
|
-
if (await fileExists$1(candidate)) return candidate;
|
|
3487
|
-
}
|
|
3488
|
-
}
|
|
3489
|
-
/**
|
|
3490
|
-
* Resolve a dist/built path back to its source .ts/.tsx equivalent.
|
|
3491
|
-
* E.g., "./dist/index.mjs" → "src/index.ts"
|
|
3492
|
-
*/
|
|
3493
|
-
async function resolveSourceEntry(pluginDir, distPath) {
|
|
3494
|
-
const cleaned = distPath.replace(LEADING_DOT_SLASH_RE, "");
|
|
3495
|
-
const srcPath = cleaned.replace(DIST_PREFIX_RE, "src/").replace(MJS_EXT_RE, ".ts");
|
|
3496
|
-
const srcFull = resolve(pluginDir, srcPath);
|
|
3497
|
-
if (await fileExists$1(srcFull)) return srcFull;
|
|
3498
|
-
const tsxFull = resolve(pluginDir, srcPath.replace(TS_TO_TSX_RE, ".tsx"));
|
|
3499
|
-
if (await fileExists$1(tsxFull)) return tsxFull;
|
|
3500
|
-
const direct = resolve(pluginDir, cleaned);
|
|
3501
|
-
if (await fileExists$1(direct)) return direct;
|
|
3502
|
-
}
|
|
3503
|
-
const TS_SOURCE_EXPORT_RE = /\.(?:ts|tsx|mts|cts|jsx)$/;
|
|
3504
|
-
/**
|
|
3505
|
-
* Find package.json exports that point to source files instead of built output.
|
|
3506
|
-
* Returns an array of `{ exportPath, resolvedPath }` for each offending export.
|
|
3507
|
-
*/
|
|
3508
|
-
function findSourceExports(exports) {
|
|
3509
|
-
const issues = [];
|
|
3510
|
-
for (const [exportPath, exportValue] of Object.entries(exports)) {
|
|
3511
|
-
const resolved = typeof exportValue === "string" ? exportValue : exportValue && typeof exportValue === "object" && "import" in exportValue ? exportValue.import : null;
|
|
3512
|
-
if (resolved && TS_SOURCE_EXPORT_RE.test(resolved)) issues.push({
|
|
3513
|
-
exportPath,
|
|
3514
|
-
resolvedPath: resolved
|
|
3515
|
-
});
|
|
3516
|
-
}
|
|
3517
|
-
return issues;
|
|
3518
|
-
}
|
|
3519
|
-
/**
|
|
3520
|
-
* Recursively walk a staging directory and return a flat list of all files
|
|
3521
|
-
* with sizes. Names are relative to `dir` so they match what would appear
|
|
3522
|
-
* as the tarball entry name.
|
|
3523
|
-
*/
|
|
3524
|
-
async function collectBundleEntries(dir) {
|
|
3525
|
-
const entries = [];
|
|
3526
|
-
await walkBundle(dir, "", entries);
|
|
3527
|
-
return entries;
|
|
3528
|
-
}
|
|
3529
|
-
async function walkBundle(dir, prefix, into) {
|
|
3530
|
-
const items = await readdir(dir, { withFileTypes: true });
|
|
3531
|
-
for (const item of items) {
|
|
3532
|
-
const fullPath = join(dir, item.name);
|
|
3533
|
-
const relPath = prefix ? `${prefix}/${item.name}` : item.name;
|
|
3534
|
-
if (item.isFile()) {
|
|
3535
|
-
const s = await stat(fullPath);
|
|
3536
|
-
into.push({
|
|
3537
|
-
name: relPath,
|
|
3538
|
-
bytes: s.size
|
|
3539
|
-
});
|
|
3540
|
-
} else if (item.isDirectory()) await walkBundle(fullPath, relPath, into);
|
|
3541
|
-
}
|
|
3542
|
-
}
|
|
3543
|
-
/**
|
|
3544
|
-
* Sum the byte sizes of all entries.
|
|
3545
|
-
*/
|
|
3546
|
-
function totalBundleBytes(entries) {
|
|
3547
|
-
let total = 0;
|
|
3548
|
-
for (const e of entries) total += e.bytes;
|
|
3549
|
-
return total;
|
|
3550
|
-
}
|
|
3551
|
-
/**
|
|
3552
|
-
* Check a bundle against the three size caps from RFC 0001:
|
|
3553
|
-
* - total decompressed ≤ MAX_BUNDLE_SIZE
|
|
3554
|
-
* - per-file decompressed ≤ MAX_FILE_SIZE
|
|
3555
|
-
* - file count ≤ MAX_FILE_COUNT
|
|
3556
|
-
*
|
|
3557
|
-
* Returns a list of violation messages (empty if the bundle is within all
|
|
3558
|
-
* caps). Messages are deterministic per input — the total/count violations
|
|
3559
|
-
* come first, then oversized files in alphabetical order — so the same
|
|
3560
|
-
* bundle always produces the same error text.
|
|
3561
|
-
*/
|
|
3562
|
-
function validateBundleSize(entries) {
|
|
3563
|
-
const violations = [];
|
|
3564
|
-
const total = totalBundleBytes(entries);
|
|
3565
|
-
if (total > MAX_BUNDLE_SIZE) violations.push(`Bundle size ${formatBytes$1(total)} exceeds maximum of ${formatBytes$1(MAX_BUNDLE_SIZE)}.`);
|
|
3566
|
-
if (entries.length > MAX_FILE_COUNT) violations.push(`Bundle contains ${entries.length} files, exceeds maximum of ${MAX_FILE_COUNT}.`);
|
|
3567
|
-
const oversized = entries.filter((e) => e.bytes > MAX_FILE_SIZE).toSorted((a, b) => a.name.localeCompare(b.name));
|
|
3568
|
-
for (const e of oversized) violations.push(`File ${e.name} is ${formatBytes$1(e.bytes)}, exceeds per-file maximum of ${formatBytes$1(MAX_FILE_SIZE)}.`);
|
|
3569
|
-
return violations;
|
|
3570
|
-
}
|
|
3571
|
-
/**
|
|
3572
|
-
* Render a byte count as a human-friendly string (e.g. "256.0 KB").
|
|
3573
|
-
*/
|
|
3574
|
-
function formatBytes$1(n) {
|
|
3575
|
-
if (n < 1024) return `${n} B`;
|
|
3576
|
-
if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;
|
|
3577
|
-
return `${(n / 1024 / 1024).toFixed(2)} MB`;
|
|
3578
|
-
}
|
|
3579
|
-
/**
|
|
3580
|
-
* Create a gzipped tarball from a directory.
|
|
3581
|
-
*/
|
|
3582
|
-
async function createTarball(sourceDir, outputPath) {
|
|
3583
|
-
const { createGzip } = await import("node:zlib");
|
|
3584
|
-
await pipeline(packTar(sourceDir), createGzip({ level: 9 }), createWriteStream(outputPath));
|
|
3585
|
-
}
|
|
3586
|
-
|
|
3587
|
-
//#endregion
|
|
3588
|
-
//#region src/cli/commands/bundle.ts
|
|
3589
|
-
/**
|
|
3590
|
-
* emdash plugin bundle
|
|
3591
|
-
*
|
|
3592
|
-
* Produces a publishable plugin tarball from a plugin source directory.
|
|
3593
|
-
*
|
|
3594
|
-
* Steps:
|
|
3595
|
-
* 1. Resolve plugin entrypoint (finds definePlugin() export)
|
|
3596
|
-
* 2. Bundle backend code with tsdown → backend.js (single ES module, tree-shaken)
|
|
3597
|
-
* 3. Bundle admin code if present → admin.js
|
|
3598
|
-
* 4. Extract manifest from definePlugin() → manifest.json
|
|
3599
|
-
* 5. Collect assets (README.md, icon.png, screenshots/)
|
|
3600
|
-
* 6. Validate bundle (manifest schema, size limits, no Node.js builtins)
|
|
3601
|
-
* 7. Create tarball ({id}-{version}.tar.gz)
|
|
3602
|
-
*/
|
|
3603
|
-
var bundle_exports = /* @__PURE__ */ __exportAll({ bundleCommand: () => bundleCommand });
|
|
3604
|
-
const TS_EXT_RE = /\.(tsx?|[mc]?js)$/;
|
|
3605
|
-
const SLASH_RE = /\//g;
|
|
3606
|
-
const LEADING_AT_RE = /^@/;
|
|
3607
|
-
const emdash_SCOPE_RE = /^@emdash-cms\//;
|
|
3608
|
-
const bundleCommand = defineCommand({
|
|
3609
|
-
meta: {
|
|
3610
|
-
name: "bundle",
|
|
3611
|
-
description: "Bundle a plugin for marketplace distribution"
|
|
3612
|
-
},
|
|
3613
|
-
args: {
|
|
3614
|
-
dir: {
|
|
3615
|
-
type: "string",
|
|
3616
|
-
description: "Plugin directory (default: current directory)",
|
|
3617
|
-
default: process.cwd()
|
|
3618
|
-
},
|
|
3619
|
-
outDir: {
|
|
3620
|
-
type: "string",
|
|
3621
|
-
alias: "o",
|
|
3622
|
-
description: "Output directory for the tarball (default: ./dist)",
|
|
3623
|
-
default: "dist"
|
|
3624
|
-
},
|
|
3625
|
-
validateOnly: {
|
|
3626
|
-
type: "boolean",
|
|
3627
|
-
description: "Run validation only, skip tarball creation",
|
|
3628
|
-
default: false
|
|
3629
|
-
}
|
|
3630
|
-
},
|
|
3631
|
-
async run({ args }) {
|
|
3632
|
-
const pluginDir = resolve(args.dir);
|
|
3633
|
-
const outDir = resolve(pluginDir, args.outDir);
|
|
3634
|
-
const validateOnly = args.validateOnly;
|
|
3635
|
-
consola.start(validateOnly ? "Validating plugin..." : "Bundling plugin...");
|
|
3636
|
-
const pkgPath = join(pluginDir, "package.json");
|
|
3637
|
-
if (!await fileExists$1(pkgPath)) {
|
|
3638
|
-
consola.error("No package.json found in", pluginDir);
|
|
3639
|
-
process.exit(1);
|
|
3640
|
-
}
|
|
3641
|
-
const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
|
|
3642
|
-
let backendEntry;
|
|
3643
|
-
let adminEntry;
|
|
3644
|
-
if (pkg.exports) {
|
|
3645
|
-
const sandboxExport = pkg.exports["./sandbox"];
|
|
3646
|
-
if (typeof sandboxExport === "string") backendEntry = await resolveSourceEntry(pluginDir, sandboxExport);
|
|
3647
|
-
else if (sandboxExport && typeof sandboxExport === "object" && "import" in sandboxExport) backendEntry = await resolveSourceEntry(pluginDir, sandboxExport.import);
|
|
3648
|
-
const adminExport = pkg.exports["./admin"];
|
|
3649
|
-
if (typeof adminExport === "string") adminEntry = await resolveSourceEntry(pluginDir, adminExport);
|
|
3650
|
-
else if (adminExport && typeof adminExport === "object" && "import" in adminExport) adminEntry = await resolveSourceEntry(pluginDir, adminExport.import);
|
|
3651
|
-
}
|
|
3652
|
-
if (!backendEntry) {
|
|
3653
|
-
const defaultSandbox = join(pluginDir, "src/sandbox-entry.ts");
|
|
3654
|
-
if (await fileExists$1(defaultSandbox)) backendEntry = defaultSandbox;
|
|
3655
|
-
}
|
|
3656
|
-
let mainEntry;
|
|
3657
|
-
if (pkg.exports?.["."] !== void 0) {
|
|
3658
|
-
const mainExport = pkg.exports["."];
|
|
3659
|
-
if (typeof mainExport === "string") mainEntry = await resolveSourceEntry(pluginDir, mainExport);
|
|
3660
|
-
else if (mainExport && typeof mainExport === "object" && "import" in mainExport) mainEntry = await resolveSourceEntry(pluginDir, mainExport.import);
|
|
3661
|
-
}
|
|
3662
|
-
if (!mainEntry && pkg.main) mainEntry = await resolveSourceEntry(pluginDir, pkg.main);
|
|
3663
|
-
if (!mainEntry) {
|
|
3664
|
-
const defaultMain = join(pluginDir, "src/index.ts");
|
|
3665
|
-
if (await fileExists$1(defaultMain)) mainEntry = defaultMain;
|
|
3666
|
-
}
|
|
3667
|
-
if (!mainEntry) {
|
|
3668
|
-
consola.error("Cannot find plugin entrypoint. Expected src/index.ts or main/exports in package.json");
|
|
3669
|
-
process.exit(1);
|
|
3670
|
-
}
|
|
3671
|
-
consola.info(`Main entry: ${mainEntry}`);
|
|
3672
|
-
if (backendEntry) consola.info(`Backend entry: ${backendEntry}`);
|
|
3673
|
-
if (adminEntry) consola.info(`Admin entry: ${adminEntry}`);
|
|
3674
|
-
consola.start("Extracting plugin manifest...");
|
|
3675
|
-
const { build } = await import("tsdown");
|
|
3676
|
-
const tmpDir = join(pluginDir, ".emdash-bundle-tmp");
|
|
3677
|
-
try {
|
|
3678
|
-
await rm(tmpDir, {
|
|
3679
|
-
recursive: true,
|
|
3680
|
-
force: true
|
|
3681
|
-
});
|
|
3682
|
-
await mkdir(tmpDir, { recursive: true });
|
|
3683
|
-
const mainOutDir = join(tmpDir, "main");
|
|
3684
|
-
await build({
|
|
3685
|
-
config: false,
|
|
3686
|
-
entry: [mainEntry],
|
|
3687
|
-
format: "esm",
|
|
3688
|
-
outDir: mainOutDir,
|
|
3689
|
-
dts: false,
|
|
3690
|
-
platform: "node",
|
|
3691
|
-
external: ["emdash", emdash_SCOPE_RE]
|
|
3692
|
-
});
|
|
3693
|
-
const pluginNodeModules = join(pluginDir, "node_modules");
|
|
3694
|
-
const tmpNodeModules = join(mainOutDir, "node_modules");
|
|
3695
|
-
if (await fileExists$1(pluginNodeModules)) await symlink(pluginNodeModules, tmpNodeModules, "junction");
|
|
3696
|
-
const mainOutputPath = await findBuildOutput(mainOutDir, basename(mainEntry).replace(TS_EXT_RE, ""));
|
|
3697
|
-
if (!mainOutputPath) {
|
|
3698
|
-
consola.error("Failed to build main entry — no output found in", mainOutDir);
|
|
3699
|
-
process.exit(1);
|
|
3700
|
-
}
|
|
3701
|
-
const pluginModule = await import(toFileImportSpecifier(mainOutputPath));
|
|
3702
|
-
let resolvedPlugin;
|
|
3703
|
-
if (typeof pluginModule.createPlugin === "function") resolvedPlugin = pluginModule.createPlugin();
|
|
3704
|
-
else if (typeof pluginModule.default === "function") resolvedPlugin = pluginModule.default();
|
|
3705
|
-
else if (typeof pluginModule.default === "object" && pluginModule.default !== null) {
|
|
3706
|
-
const defaultExport = pluginModule.default;
|
|
3707
|
-
if ("id" in defaultExport && "version" in defaultExport) resolvedPlugin = defaultExport;
|
|
3708
|
-
}
|
|
3709
|
-
if (!resolvedPlugin) for (const [key, value] of Object.entries(pluginModule)) {
|
|
3710
|
-
if (key === "default" || typeof value !== "function") continue;
|
|
3711
|
-
try {
|
|
3712
|
-
const result = value();
|
|
3713
|
-
if (result && typeof result === "object" && "id" in result && "version" in result) {
|
|
3714
|
-
resolvedPlugin = {
|
|
3715
|
-
id: result.id,
|
|
3716
|
-
version: result.version,
|
|
3717
|
-
capabilities: result.capabilities ?? [],
|
|
3718
|
-
allowedHosts: result.allowedHosts ?? [],
|
|
3719
|
-
storage: result.storage ?? {},
|
|
3720
|
-
hooks: {},
|
|
3721
|
-
routes: {},
|
|
3722
|
-
admin: {
|
|
3723
|
-
pages: result.adminPages,
|
|
3724
|
-
widgets: result.adminWidgets
|
|
3725
|
-
}
|
|
3726
|
-
};
|
|
3727
|
-
if (backendEntry) {
|
|
3728
|
-
const backendProbeDir = join(tmpDir, "backend-probe");
|
|
3729
|
-
const probeShimDir = join(tmpDir, "probe-shims");
|
|
3730
|
-
await mkdir(probeShimDir, { recursive: true });
|
|
3731
|
-
await writeFile(join(probeShimDir, "emdash.mjs"), "export const definePlugin = (d) => d;\n");
|
|
3732
|
-
await build({
|
|
3733
|
-
config: false,
|
|
3734
|
-
entry: [backendEntry],
|
|
3735
|
-
format: "esm",
|
|
3736
|
-
outDir: backendProbeDir,
|
|
3737
|
-
dts: false,
|
|
3738
|
-
platform: "neutral",
|
|
3739
|
-
external: [],
|
|
3740
|
-
alias: { emdash: join(probeShimDir, "emdash.mjs") },
|
|
3741
|
-
treeshake: true
|
|
3742
|
-
});
|
|
3743
|
-
const backendProbePath = await findBuildOutput(backendProbeDir, basename(backendEntry).replace(TS_EXT_RE, ""));
|
|
3744
|
-
if (backendProbePath) {
|
|
3745
|
-
const standardDef = (await import(toFileImportSpecifier(backendProbePath))).default ?? {};
|
|
3746
|
-
const hooks = standardDef.hooks;
|
|
3747
|
-
const routes = standardDef.routes;
|
|
3748
|
-
if (hooks) for (const hookName of Object.keys(hooks)) {
|
|
3749
|
-
const hookEntry = hooks[hookName];
|
|
3750
|
-
const isConfig = typeof hookEntry === "object" && hookEntry !== null && "handler" in hookEntry;
|
|
3751
|
-
const config = isConfig ? hookEntry : {};
|
|
3752
|
-
resolvedPlugin.hooks[hookName] = {
|
|
3753
|
-
handler: isConfig ? hookEntry.handler : hookEntry,
|
|
3754
|
-
priority: config.priority ?? 100,
|
|
3755
|
-
timeout: config.timeout ?? 5e3,
|
|
3756
|
-
dependencies: config.dependencies ?? [],
|
|
3757
|
-
errorPolicy: config.errorPolicy ?? "abort",
|
|
3758
|
-
exclusive: config.exclusive ?? false,
|
|
3759
|
-
pluginId: result.id
|
|
3760
|
-
};
|
|
3761
|
-
}
|
|
3762
|
-
if (routes) for (const [name, route] of Object.entries(routes)) {
|
|
3763
|
-
const routeObj = typeof route === "object" && route !== null ? route : {};
|
|
3764
|
-
resolvedPlugin.routes[name] = {
|
|
3765
|
-
handler: typeof route === "function" ? route : routeObj.handler,
|
|
3766
|
-
...extractRouteOptions(route)
|
|
3767
|
-
};
|
|
3768
|
-
}
|
|
3769
|
-
}
|
|
3770
|
-
}
|
|
3771
|
-
break;
|
|
3772
|
-
}
|
|
3773
|
-
} catch (error) {
|
|
3774
|
-
if (resolvedPlugin) throw error;
|
|
3775
|
-
}
|
|
3776
|
-
}
|
|
3777
|
-
if (!resolvedPlugin?.id || !resolvedPlugin?.version) {
|
|
3778
|
-
consola.error("Could not extract plugin definition. Expected one of:\n - createPlugin() export (native format)\n - Descriptor factory function returning { id, version, ... } (standard format)");
|
|
3779
|
-
process.exit(1);
|
|
3780
|
-
}
|
|
3781
|
-
const manifest = extractManifest(resolvedPlugin);
|
|
3782
|
-
if (resolvedPlugin.admin?.entry) {
|
|
3783
|
-
consola.error("Plugin declares adminEntry — React admin components require native/trusted mode. Use Block Kit for sandboxed admin pages, or remove adminEntry.");
|
|
3784
|
-
process.exit(1);
|
|
3785
|
-
}
|
|
3786
|
-
if (resolvedPlugin.admin?.portableTextBlocks && resolvedPlugin.admin.portableTextBlocks.length > 0) {
|
|
3787
|
-
consola.error("Plugin declares portableTextBlocks — these require native/trusted mode and cannot be bundled for the marketplace.");
|
|
3788
|
-
process.exit(1);
|
|
3789
|
-
}
|
|
3790
|
-
consola.success(`Plugin: ${manifest.id}@${manifest.version}`);
|
|
3791
|
-
consola.info(` Capabilities: ${manifest.capabilities.length > 0 ? manifest.capabilities.join(", ") : "(none)"}`);
|
|
3792
|
-
consola.info(` Hooks: ${manifest.hooks.length > 0 ? manifest.hooks.map((h) => typeof h === "string" ? h : h.name).join(", ") : "(none)"}`);
|
|
3793
|
-
consola.info(` Routes: ${manifest.routes.length > 0 ? manifest.routes.map((r) => typeof r === "string" ? r : r.name).join(", ") : "(none)"}`);
|
|
3794
|
-
const bundleDir = join(tmpDir, "bundle");
|
|
3795
|
-
await mkdir(bundleDir, { recursive: true });
|
|
3796
|
-
if (backendEntry) {
|
|
3797
|
-
consola.start("Bundling backend...");
|
|
3798
|
-
const shimDir = join(tmpDir, "shims");
|
|
3799
|
-
await mkdir(shimDir, { recursive: true });
|
|
3800
|
-
await writeFile(join(shimDir, "emdash.mjs"), "export const definePlugin = (d) => d;\n");
|
|
3801
|
-
await build({
|
|
3802
|
-
config: false,
|
|
3803
|
-
entry: [backendEntry],
|
|
3804
|
-
format: "esm",
|
|
3805
|
-
outDir: join(tmpDir, "backend"),
|
|
3806
|
-
dts: false,
|
|
3807
|
-
platform: "neutral",
|
|
3808
|
-
external: [],
|
|
3809
|
-
alias: { emdash: join(shimDir, "emdash.mjs") },
|
|
3810
|
-
minify: true,
|
|
3811
|
-
treeshake: true
|
|
3812
|
-
});
|
|
3813
|
-
const backendBaseName = basename(backendEntry).replace(TS_EXT_RE, "");
|
|
3814
|
-
const backendOutputPath = await findBuildOutput(join(tmpDir, "backend"), backendBaseName);
|
|
3815
|
-
if (backendOutputPath) {
|
|
3816
|
-
await copyFile(backendOutputPath, join(bundleDir, "backend.js"));
|
|
3817
|
-
consola.success("Built backend.js");
|
|
3818
|
-
} else {
|
|
3819
|
-
consola.error("Backend build produced no output");
|
|
3820
|
-
process.exit(1);
|
|
3821
|
-
}
|
|
3822
|
-
} else {
|
|
3823
|
-
consola.warn("No sandbox entry found — bundle will have no backend.js");
|
|
3824
|
-
consola.warn(" Add a \"sandbox-entry.ts\" in src/ or a \"./sandbox\" export in package.json");
|
|
3825
|
-
}
|
|
3826
|
-
if (adminEntry) {
|
|
3827
|
-
consola.start("Bundling admin...");
|
|
3828
|
-
await build({
|
|
3829
|
-
config: false,
|
|
3830
|
-
entry: [adminEntry],
|
|
3831
|
-
format: "esm",
|
|
3832
|
-
outDir: join(tmpDir, "admin"),
|
|
3833
|
-
dts: false,
|
|
3834
|
-
platform: "neutral",
|
|
3835
|
-
external: [],
|
|
3836
|
-
minify: true,
|
|
3837
|
-
treeshake: true
|
|
3838
|
-
});
|
|
3839
|
-
const adminBaseName = basename(adminEntry).replace(TS_EXT_RE, "");
|
|
3840
|
-
const adminOutputPath = await findBuildOutput(join(tmpDir, "admin"), adminBaseName);
|
|
3841
|
-
if (adminOutputPath) {
|
|
3842
|
-
await copyFile(adminOutputPath, join(bundleDir, "admin.js"));
|
|
3843
|
-
consola.success("Built admin.js");
|
|
3844
|
-
}
|
|
3845
|
-
}
|
|
3846
|
-
await writeFile(join(bundleDir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
3847
|
-
consola.start("Collecting assets...");
|
|
3848
|
-
const readmePath = join(pluginDir, "README.md");
|
|
3849
|
-
if (await fileExists$1(readmePath)) {
|
|
3850
|
-
await copyFile(readmePath, join(bundleDir, "README.md"));
|
|
3851
|
-
consola.success("Included README.md");
|
|
3852
|
-
}
|
|
3853
|
-
const iconPath = join(pluginDir, "icon.png");
|
|
3854
|
-
if (await fileExists$1(iconPath)) {
|
|
3855
|
-
const dims = readImageDimensions(await readFile(iconPath));
|
|
3856
|
-
if (!dims) consola.warn("icon.png is not a valid PNG — skipping");
|
|
3857
|
-
else if (dims[0] !== ICON_SIZE || dims[1] !== ICON_SIZE) {
|
|
3858
|
-
consola.warn(`icon.png is ${dims[0]}x${dims[1]}, expected ${ICON_SIZE}x${ICON_SIZE} — including anyway`);
|
|
3859
|
-
await copyFile(iconPath, join(bundleDir, "icon.png"));
|
|
3860
|
-
} else {
|
|
3861
|
-
await copyFile(iconPath, join(bundleDir, "icon.png"));
|
|
3862
|
-
consola.success("Included icon.png");
|
|
3863
|
-
}
|
|
3864
|
-
}
|
|
3865
|
-
const screenshotsDir = join(pluginDir, "screenshots");
|
|
3866
|
-
if (await fileExists$1(screenshotsDir)) {
|
|
3867
|
-
const screenshotFiles = (await readdir(screenshotsDir)).filter((f) => {
|
|
3868
|
-
const ext = extname(f).toLowerCase();
|
|
3869
|
-
return ext === ".png" || ext === ".jpg" || ext === ".jpeg";
|
|
3870
|
-
}).toSorted().slice(0, MAX_SCREENSHOTS);
|
|
3871
|
-
if (screenshotFiles.length > 0) {
|
|
3872
|
-
await mkdir(join(bundleDir, "screenshots"), { recursive: true });
|
|
3873
|
-
for (const file of screenshotFiles) {
|
|
3874
|
-
const filePath = join(screenshotsDir, file);
|
|
3875
|
-
const dims = readImageDimensions(await readFile(filePath));
|
|
3876
|
-
if (!dims) {
|
|
3877
|
-
consola.warn(`screenshots/${file} — cannot read dimensions, skipping`);
|
|
3878
|
-
continue;
|
|
3879
|
-
}
|
|
3880
|
-
if (dims[0] > MAX_SCREENSHOT_WIDTH || dims[1] > MAX_SCREENSHOT_HEIGHT) consola.warn(`screenshots/${file} is ${dims[0]}x${dims[1]}, max ${MAX_SCREENSHOT_WIDTH}x${MAX_SCREENSHOT_HEIGHT} — including anyway`);
|
|
3881
|
-
await copyFile(filePath, join(bundleDir, "screenshots", file));
|
|
3882
|
-
}
|
|
3883
|
-
consola.success(`Included ${screenshotFiles.length} screenshot(s)`);
|
|
3884
|
-
}
|
|
3885
|
-
}
|
|
3886
|
-
consola.start("Validating bundle...");
|
|
3887
|
-
let hasErrors = false;
|
|
3888
|
-
if (pkg.exports) for (const issue of findSourceExports(pkg.exports)) {
|
|
3889
|
-
consola.error(`Export "${issue.exportPath}" points to source (${issue.resolvedPath}). Package exports must point to built files (e.g. dist/*.mjs). Add a build step and update the exports map.`);
|
|
3890
|
-
hasErrors = true;
|
|
3891
|
-
}
|
|
3892
|
-
const backendPath = join(bundleDir, "backend.js");
|
|
3893
|
-
if (await fileExists$1(backendPath)) {
|
|
3894
|
-
const builtins = findNodeBuiltinImports(await readFile(backendPath, "utf-8"));
|
|
3895
|
-
if (builtins.length > 0) {
|
|
3896
|
-
consola.error(`backend.js imports Node.js built-in modules: ${builtins.join(", ")}`);
|
|
3897
|
-
consola.error("Sandboxed plugins cannot use Node.js APIs");
|
|
3898
|
-
hasErrors = true;
|
|
3899
|
-
}
|
|
3900
|
-
}
|
|
3901
|
-
const declaresUnrestricted = manifest.capabilities.includes("network:request:unrestricted") || manifest.capabilities.includes("network:fetch:any");
|
|
3902
|
-
const declaresHostRestricted = manifest.capabilities.includes("network:request") || manifest.capabilities.includes("network:fetch");
|
|
3903
|
-
if (declaresUnrestricted) consola.warn("Plugin declares unrestricted network access (network:request:unrestricted) — it can make requests to any host");
|
|
3904
|
-
else if (declaresHostRestricted && manifest.allowedHosts.length === 0) consola.warn("Plugin declares network:request capability but no allowedHosts — all requests will be blocked");
|
|
3905
|
-
const deprecatedCaps = manifest.capabilities.filter(isDeprecatedCapability);
|
|
3906
|
-
if (deprecatedCaps.length > 0) {
|
|
3907
|
-
consola.warn("Plugin uses deprecated capability names. Rename them before publishing:");
|
|
3908
|
-
for (const cap of deprecatedCaps) {
|
|
3909
|
-
const replacement = CAPABILITY_RENAMES[cap];
|
|
3910
|
-
consola.warn(` ${cap} → ${replacement}`);
|
|
3911
|
-
}
|
|
3912
|
-
}
|
|
3913
|
-
if (resolvedPlugin.admin?.portableTextBlocks && resolvedPlugin.admin.portableTextBlocks.length > 0) consola.warn("Plugin declares portableTextBlocks — these require trusted mode and will be ignored in sandboxed plugins");
|
|
3914
|
-
if (resolvedPlugin.admin?.entry) consola.warn("Plugin declares admin.entry — custom React components require trusted mode. Use Block Kit for sandboxed admin pages");
|
|
3915
|
-
if (resolvedPlugin.hooks["page:fragments"]) consola.warn("Plugin declares page:fragments hook — this is trusted-only and will not work in sandboxed mode");
|
|
3916
|
-
const hasAdminPages = (manifest.admin?.pages?.length ?? 0) > 0;
|
|
3917
|
-
const hasAdminWidgets = (manifest.admin?.widgets?.length ?? 0) > 0;
|
|
3918
|
-
if (hasAdminPages || hasAdminWidgets) {
|
|
3919
|
-
if (!manifest.routes.map((r) => typeof r === "string" ? r : r.name).includes("admin")) {
|
|
3920
|
-
consola.error(`Plugin declares ${hasAdminPages ? "adminPages" : ""}${hasAdminPages && hasAdminWidgets ? " and " : ""}${hasAdminWidgets ? "adminWidgets" : ""} but the sandbox entry has no "admin" route. Add an admin route handler to serve Block Kit pages.`);
|
|
3921
|
-
hasErrors = true;
|
|
3922
|
-
}
|
|
3923
|
-
}
|
|
3924
|
-
const bundleEntries = await collectBundleEntries(bundleDir);
|
|
3925
|
-
const sizeViolations = validateBundleSize(bundleEntries);
|
|
3926
|
-
if (sizeViolations.length > 0) {
|
|
3927
|
-
for (const v of sizeViolations) consola.error(v);
|
|
3928
|
-
hasErrors = true;
|
|
3929
|
-
} else consola.info(`Bundle size: ${formatBytes$1(totalBundleBytes(bundleEntries))} across ${bundleEntries.length} file${bundleEntries.length === 1 ? "" : "s"}`);
|
|
3930
|
-
if (hasErrors) {
|
|
3931
|
-
consola.error("Bundle validation failed");
|
|
3932
|
-
process.exit(1);
|
|
3933
|
-
}
|
|
3934
|
-
consola.success("Validation passed");
|
|
3935
|
-
if (validateOnly) return;
|
|
3936
|
-
await mkdir(outDir, { recursive: true });
|
|
3937
|
-
const tarballName = `${manifest.id.replace(SLASH_RE, "-").replace(LEADING_AT_RE, "")}-${manifest.version}.tar.gz`;
|
|
3938
|
-
const tarballPath = join(outDir, tarballName);
|
|
3939
|
-
consola.start("Creating tarball...");
|
|
3940
|
-
await createTarball(bundleDir, tarballPath);
|
|
3941
|
-
const tarballSizeKB = ((await stat(tarballPath)).size / 1024).toFixed(1);
|
|
3942
|
-
const tarballBuf = await readFile(tarballPath);
|
|
3943
|
-
const checksum = createHash("sha256").update(tarballBuf).digest("hex");
|
|
3944
|
-
consola.success(`Created ${tarballName} (${tarballSizeKB}KB)`);
|
|
3945
|
-
consola.info(` SHA-256: ${checksum}`);
|
|
3946
|
-
consola.info(` Path: ${tarballPath}`);
|
|
3947
|
-
} finally {
|
|
3948
|
-
if (tmpDir.endsWith(".emdash-bundle-tmp")) await rm(tmpDir, {
|
|
3949
|
-
recursive: true,
|
|
3950
|
-
force: true
|
|
3951
|
-
});
|
|
3952
|
-
}
|
|
3953
|
-
}
|
|
3954
|
-
});
|
|
3955
|
-
|
|
3956
3569
|
//#endregion
|
|
3957
3570
|
//#region src/cli/commands/plugin-init.ts
|
|
3958
3571
|
/**
|
|
@@ -4013,7 +3626,7 @@ const pluginInitCommand = defineCommand({
|
|
|
4013
3626
|
process.exit(1);
|
|
4014
3627
|
}
|
|
4015
3628
|
const srcDir = join(targetDir, "src");
|
|
4016
|
-
if (await fileExists$
|
|
3629
|
+
if (await fileExists$4(join(targetDir, "package.json"))) {
|
|
4017
3630
|
consola.error(`package.json already exists in ${targetDir}`);
|
|
4018
3631
|
process.exit(1);
|
|
4019
3632
|
}
|
|
@@ -4495,7 +4108,7 @@ const publishCommand = defineCommand({
|
|
|
4495
4108
|
const pluginDir = resolve(args.dir);
|
|
4496
4109
|
try {
|
|
4497
4110
|
const { runCommand } = await import("citty");
|
|
4498
|
-
const { bundleCommand } = await
|
|
4111
|
+
const { bundleCommand } = await import("../bundle-Db1iNMv_.mjs").then((n) => n.n);
|
|
4499
4112
|
await runCommand(bundleCommand, { rawArgs: ["--dir", pluginDir] });
|
|
4500
4113
|
} catch {
|
|
4501
4114
|
consola.error("Build failed");
|