dineway 0.1.48 → 0.2.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/{activity-events-C9u37D5z.mjs → activity-events-y6eT8UW6.mjs} +6 -38
- package/dist/actor-CrObAPV0.mjs +37 -0
- package/dist/after-BfniwgIf.mjs +9 -0
- package/dist/{allowed-origins-DhipQNLb.mjs → allowed-origins-_oeyP6x-.mjs} +1 -1
- package/dist/api/route-utils.d.mts +10 -10
- package/dist/api/route-utils.mjs +17 -14
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -4
- package/dist/{api-Eiy8_zVZ.mjs → api-ByrU2q-Z.mjs} +61 -37
- package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-CjVMQT-X.mjs} +6 -2
- package/dist/{apply-CX3no7XE.mjs → apply-bZswmZPm.mjs} +117 -77
- package/dist/astro/image-endpoint.d.mts +7 -0
- package/dist/astro/image-endpoint.mjs +54 -0
- package/dist/astro/index.d.mts +35 -11
- package/dist/astro/index.mjs +157 -23
- package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
- package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +42 -24
- package/dist/astro/middleware/redirect.mjs +14 -5
- package/dist/astro/middleware/request-context.mjs +9 -6
- package/dist/astro/middleware/seed.d.mts +1 -1
- package/dist/astro/middleware/seed.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.mjs +334 -193
- package/dist/astro/routes/admin.astro +6 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/briefing.mjs +22 -18
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +18 -15
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +18 -15
- package/dist/astro/routes/api/admin/bylines/index.mjs +18 -15
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +15 -13
- package/dist/astro/routes/api/admin/comments/_id_.mjs +7 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +12 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +7 -6
- package/dist/astro/routes/api/admin/comments/index.mjs +12 -10
- package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -25
- package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -25
- package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -29
- package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -29
- package/dist/astro/routes/api/admin/context/diff.mjs +31 -28
- package/dist/astro/routes/api/admin/context/index.mjs +32 -29
- package/dist/astro/routes/api/admin/context/stale.mjs +31 -28
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -25
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -28
- package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -28
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -26
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -52
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -52
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +48 -44
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -50
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -49
- package/dist/astro/routes/api/admin/plugins/index.mjs +48 -44
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -49
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/updates.mjs +47 -43
- package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -28
- package/dist/astro/routes/api/admin/review-requests/index.mjs +11 -10
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +47 -43
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +47 -43
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
- package/dist/astro/routes/api/admin/users/index.mjs +7 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
- package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +10 -9
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
- package/dist/astro/routes/api/auth/setup-token/index.mjs +6 -6
- package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
- package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +16 -14
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +12 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +17 -15
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -6
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
- package/dist/astro/routes/api/dashboard.mjs +10 -9
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/health.mjs +1 -1
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +23 -11
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +19 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +85 -38
- package/dist/astro/routes/api/import/wordpress/media.d.mts +13 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -33
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +18 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +121 -101
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +25 -13
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +56 -2
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -56
- package/dist/astro/routes/api/manifest.mjs +14 -5
- package/dist/astro/routes/api/mcp.mjs +266 -70
- package/dist/astro/routes/api/media/_id_/confirm.mjs +39 -11
- package/dist/astro/routes/api/media/_id_.mjs +11 -7
- package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +12 -11
- package/dist/astro/routes/api/media.mjs +28 -35
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -29
- package/dist/astro/routes/api/menus/_name_/items.mjs +32 -29
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -29
- package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -29
- package/dist/astro/routes/api/menus/_name_.mjs +32 -29
- package/dist/astro/routes/api/menus/index.mjs +32 -29
- package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
- package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
- package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
- package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
- package/dist/astro/routes/api/oauth/token.mjs +6 -6
- package/dist/astro/routes/api/openapi.json.mjs +4 -3
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +30 -30
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -11
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -11
- package/dist/astro/routes/api/redirects/_id_.mjs +33 -30
- package/dist/astro/routes/api/redirects/index.mjs +33 -30
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +48 -44
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -44
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -44
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -44
- package/dist/astro/routes/api/schema/collections/index.mjs +48 -44
- package/dist/astro/routes/api/schema/index.mjs +13 -14
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +47 -43
- package/dist/astro/routes/api/schema/orphans/index.mjs +47 -43
- package/dist/astro/routes/api/search/enable.mjs +12 -11
- package/dist/astro/routes/api/search/index.mjs +11 -10
- package/dist/astro/routes/api/search/rebuild.mjs +12 -11
- package/dist/astro/routes/api/search/stats.mjs +7 -7
- package/dist/astro/routes/api/search/suggest.mjs +11 -10
- package/dist/astro/routes/api/sections/_slug_.mjs +32 -29
- package/dist/astro/routes/api/sections/index.mjs +32 -29
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +32 -29
- package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
- package/dist/astro/routes/api/setup/admin.mjs +12 -11
- package/dist/astro/routes/api/setup/dev-bypass.mjs +32 -26
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +30 -26
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +9 -8
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -32
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -32
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -32
- package/dist/astro/routes/api/taxonomies/index.mjs +35 -32
- package/dist/astro/routes/api/themes/preview.mjs +6 -6
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +3 -3
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +31 -28
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -29
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -29
- package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -27
- package/dist/astro/routes/api/widget-areas/index.mjs +32 -29
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +9 -8
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +24 -15
- package/dist/astro/routes/sitemap.xml.mjs +10 -9
- package/dist/astro/session-driver.d.mts +1 -1
- package/dist/astro/session-driver.mjs +3 -3
- package/dist/astro/types.d.mts +21 -13
- package/dist/{audit-D1cbG7xH.mjs → audit-ByVKIwWF.mjs} +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-CqeUmQsv.mjs} +1 -1
- package/dist/{authorize-BLO0m7fW.mjs → authorize-CcBxcHtz.mjs} +1 -1
- package/dist/{briefing-CObXGOGz.mjs → briefing-BJaJI8dm.mjs} +2 -1
- package/dist/{briefing-gKWiGLt1.mjs → briefing-CawZ59CY.mjs} +90 -28
- package/dist/bundle-7C_DpkEq.mjs +602 -0
- package/dist/{byline-1ntDwv8c.mjs → byline-e51-fWRs.mjs} +30 -62
- package/dist/{byline-fields-BX7rWKNU.d.mts → byline-fields-CUvbslGc.d.mts} +49 -6
- package/dist/{byline-fields-C9_iaPaM.mjs → byline-fields-D-N5qVIG.mjs} +1 -1
- package/dist/{byline-fields-B-ZkoVft.mjs → byline-fields-DOJO16Gm.mjs} +3 -3
- package/dist/{byline-registry-CUSvkasJ.mjs → byline-registry-87nNnYl4.mjs} +2 -2
- package/dist/{bylines-bC15ZqAv.mjs → bylines-CMQNCNFh.mjs} +9 -3
- package/dist/{bylines-DtxChhN_.mjs → bylines-y4LO-dTj.mjs} +5 -5
- package/dist/{cache-DbKyr60Q.mjs → cache-C-FNTFYK.mjs} +2 -2
- package/dist/{chunks-C5zp2xir.mjs → chunks-CxBt-GxR.mjs} +1 -1
- package/dist/cli/index.mjs +820 -1276
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +2 -1
- package/dist/{comment-CXDOQ93N.mjs → comment-DlA4iChg.mjs} +13 -3
- package/dist/comment-reaction-DfFao1ST.mjs +58 -0
- package/dist/{comments-hK-rdzJ9.mjs → comments-DApFGMsP.mjs} +1 -1
- package/dist/{content-QaryevFO.mjs → content-Bh4BDjv8.mjs} +51 -34
- package/dist/content-refresh-CgutSUfO.mjs +1576 -0
- package/dist/{context-CoYb_fvK.mjs → context-C5W3G18y.mjs} +111 -50
- package/dist/{context-DBL1ib4v.mjs → context-CK4ym2Sf.mjs} +2 -2
- package/dist/{context-route-helpers-CYQVmbIm.mjs → context-route-helpers-MASyGgWf.mjs} +2 -1
- package/dist/{cron-DxCAU_Sn.mjs → cron-cKcNTix_.mjs} +7 -3
- package/dist/{dashboard-DNlqsknJ.mjs → dashboard-DQkVT7Ei.mjs} +4 -4
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{device-flow-DygsFPGL.mjs → device-flow-BnqRH-T9.mjs} +5 -5
- package/dist/{placeholder-BDo81Is5.mjs → enrich-DIFIFA8O.mjs} +36 -9
- package/dist/{error-DCSuUAZW.mjs → error-CytFlgcd.mjs} +5 -0
- package/dist/field-defs-cache-DRNdhBJv.mjs +49 -0
- package/dist/{fts-manager-CIZlScg5.mjs → fts-manager-Crzypjqu.mjs} +1 -1
- package/dist/hitl-Hw1RmWOq.mjs +677 -0
- package/dist/{hitl-requests-CGQwOEiq.mjs → hitl-requests-B4Vbcmaq.mjs} +2 -2
- package/dist/{hitl-route-helpers-GSDLNPpN.mjs → hitl-route-helpers-hEVzvP8l.mjs} +5 -4
- package/dist/import-Bh9biJfx.mjs +1354 -0
- package/dist/{index-CwRuZ-u8.d.mts → index-D4y6NGiy.d.mts} +75 -3
- package/dist/index.d.mts +17 -16
- package/dist/index.mjs +81 -69
- package/dist/{jsonld-DZ67souc.d.mts → jsonld-Dq0gsnOH.d.mts} +8 -4
- package/dist/{load-xE01Jm0V.mjs → load-DmYeniXl.mjs} +1 -1
- package/dist/{loader-tg63WSY2.mjs → loader-CjWqjweO.mjs} +117 -31
- package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-BxVPYMJR.mjs} +34 -1
- package/dist/mcp-reviewed-executor-TwVbMzG6.mjs +555 -0
- package/dist/media/image-endpoint.d.mts +32 -0
- package/dist/media/image-endpoint.mjs +111 -0
- package/dist/media/index.d.mts +27 -2
- package/dist/media/index.mjs +5 -3
- package/dist/media/local-runtime.d.mts +16 -11
- package/dist/media/local-runtime.mjs +10 -8
- package/dist/{media-DUAjMfvR.mjs → media-DMj0grzC.mjs} +3 -1
- package/dist/{media-allowlist-BsXkT9RK.mjs → media-allowlist-BlVCSzHx.mjs} +1 -1
- package/dist/media-url-lEKSrpr9.mjs +20 -0
- package/dist/{menus-WpFRMXjz.mjs → menus-TaW1gKnk.mjs} +19 -5
- package/dist/{menus-DU1eZqw_.mjs → menus-xvsnVZXw.mjs} +80 -15
- package/dist/{normalize-DUnoXAa9.mjs → normalize-5ek_z7de.mjs} +8 -1
- package/dist/{oauth-authorization-D-1p52Je.mjs → oauth-authorization-DiaGvRVz.mjs} +5 -5
- package/dist/{oauth-clients-CzeMGyUU.mjs → oauth-clients-Dl9E8dEM.mjs} +2 -2
- package/dist/object-cache/memory.d.mts +14 -0
- package/dist/object-cache/memory.mjs +55 -0
- package/dist/object-cache-D51qOseS.mjs +419 -0
- package/dist/page/index.d.mts +4 -3
- package/dist/page/index.mjs +2 -2
- package/dist/{parse-CneSgl7-.mjs → parse-CbymENaR.mjs} +1 -1
- package/dist/{parser-DxfsARXL.mjs → parser-C1nYd-81.mjs} +151 -9
- package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-uvNRZBX9.d.mts} +12 -4
- package/dist/plugin-utils.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -9
- package/dist/plugins/adapt-sandbox-entry.mjs +11 -2
- package/dist/{plugins-C57YQi4l.mjs → plugins-BolVa-tl.mjs} +832 -64
- package/dist/{transport-LSdZVXHF.mjs → portable-text-dA_UlJwW.mjs} +1 -134
- package/dist/{preview-D5rvDhRt.mjs → preview-vSVg6fwG.mjs} +4 -3
- package/dist/process-cache-7xgAO9JY.mjs +106 -0
- package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-MD8zAbnH.d.mts} +1 -1
- package/dist/{public-url-DLUM5OOv.mjs → public-url-BEz_sM9n.mjs} +24 -18
- package/dist/{public-url-B5HaoGzj.d.mts → public-url-gsp3oUbu.d.mts} +5 -4
- package/dist/{query-BYc3oruA.mjs → query-CfRCdaL3.mjs} +281 -76
- package/dist/{query-DKEwzobh.mjs → query-jaAmw8E1.mjs} +11 -6
- package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-ZLdyWoZF.mjs} +2 -2
- package/dist/{redirect-C2zXRj3c.mjs → redirect-BAjt4Z6b.mjs} +2 -2
- package/dist/{redirects-YZo_znWG.mjs → redirects-BTdwpQtE.mjs} +47 -24
- package/dist/{redirects-ocRJmQHP.mjs → redirects-CA-xylPG.mjs} +19 -11
- package/dist/{registry-CTkbIDB9.mjs → registry-CtyVedcN.mjs} +130 -77
- package/dist/request-context.d.mts +2 -0
- package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CUypToDJ.mjs} +1 -1
- package/dist/{review-requests-C0un5kdV.mjs → review-requests-C9Ff11Vq.mjs} +1 -1
- package/dist/{review-requests-gGMyYYhy.mjs → review-requests-DUyEmtmG.mjs} +1 -1
- package/dist/{runner-D4FL9usy.d.mts → runner-1tC2tIRV.d.mts} +1 -1
- package/dist/runner-DB7CRfOF.mjs +6740 -0
- package/dist/{runtime-DEWQpZ-4.d.mts → runtime-BOeiQsCv.d.mts} +2028 -1564
- package/dist/runtime.d.mts +10 -10
- package/dist/runtime.mjs +4 -4
- package/dist/schema-DXdYj4R3.mjs +8 -0
- package/dist/{search-axGQ1KY3.mjs → search-DSaLgEFI.mjs} +5 -3
- package/dist/{secrets-062Izo8i.mjs → secrets-CDZo2k8L.mjs} +15 -12
- package/dist/{sections-OLKgXL10.mjs → sections-PVVXHGfp.mjs} +2 -2
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +22 -19
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.mjs +3 -12
- package/dist/{seo-Cd45Po8L.mjs → seo-CQG3GCHQ.mjs} +5 -2
- package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-C1EnikHB.mjs} +11 -3
- package/dist/{seo-5lJOtB5J.mjs → seo-qa7Dn0jK.mjs} +22 -4
- package/dist/{service-Bwad8s5h.mjs → service-DiN4ZuPp.mjs} +2 -2
- package/dist/session-user-CAKImna3.mjs +22 -0
- package/dist/{settings-yLjz_I4T.mjs → settings-BbqgHWpU.mjs} +28 -55
- package/dist/{settings-lAHjaUit.mjs → settings-i4VPP8bT.mjs} +2 -2
- package/dist/{setup-complete--PradA4R.mjs → setup-complete-B8fl-mjV.mjs} +1 -1
- package/dist/{site-activity-D7Xyropw.mjs → site-activity-Dy3FROs0.mjs} +1 -1
- package/dist/{site-context-DaN9Z91j.mjs → site-context-DQiL8Fl5.mjs} +23 -652
- package/dist/{site-url-DpGZo9Z6.mjs → site-url-BML3GQYm.mjs} +1 -1
- package/dist/status-DANd8ERo.mjs +21 -0
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-uXVEoQso.mjs → taxonomies-9s-v03H-.mjs} +36 -29
- package/dist/taxonomies-DRiixp_E.mjs +443 -0
- package/dist/{taxonomy-CBmkmMuU.mjs → taxonomy-Dvsw6BOs.mjs} +44 -9
- package/dist/{tokens-CjSgb0AC.mjs → tokens-1RK1n6ED.mjs} +1 -1
- package/dist/transport-BNmCqLu7.mjs +134 -0
- package/dist/types-4garmdWa.mjs +66 -0
- package/dist/{types-DSPGWjxO.d.mts → types-C8XW6L19.d.mts} +225 -4
- package/dist/{types-GaCtZ1k9.d.mts → types-CDpH6MA4.d.mts} +18 -0
- package/dist/{types-DRIKLmJI.d.mts → types-C_ly5eTp.d.mts} +17 -2
- package/dist/types-DF7ZuGGk.d.mts +118 -0
- package/dist/types-DU0bU2Wu.d.mts +2392 -0
- package/dist/{types-CwawBUTa.d.mts → types-DW_-sFyz.d.mts} +2 -1
- package/dist/{types-DfuD0Afl.mjs → types-Dq1qT19x.mjs} +2 -2
- package/dist/ui/server-runtime.d.mts +15 -15
- package/dist/ui/server-runtime.mjs +25 -21
- package/dist/url-Cac7a9QZ.mjs +33 -0
- package/dist/{user-DtNmjNYt.mjs → user-BIZPzCb9.mjs} +2 -2
- package/dist/{utils-wv-zvC-Y.mjs → utils-CMDhr5Xd.mjs} +129 -7
- package/dist/{validate-BMs11tan.d.mts → validate-CZvb-BKB.d.mts} +10 -7
- package/dist/{validate-7SYRbz2f.mjs → validate-DNs0pTSc.mjs} +11 -6
- package/dist/version-BTvfRGc6.mjs +6 -0
- package/dist/{widgets-DR8EHuRO.mjs → widgets-f0ibZUIq.mjs} +46 -43
- package/dist/{wordpress-slugs-Dvhxh4cl.mjs → wordpress-slugs-BhHJX8XE.mjs} +1 -1
- package/dist/{zod-generator-BS9-umbk.mjs → zod-generator-B7TMjyFJ.mjs} +41 -13
- package/package.json +31 -8
- package/src/components/Block.astro +50 -0
- package/src/components/Comments.astro +143 -1
- package/src/components/DinewayHead.astro +19 -2
- package/src/components/DinewayImage.astro +66 -33
- package/src/components/DinewayMedia.astro +1 -2
- package/src/components/Image.astro +85 -40
- package/src/components/InlinePortableTextEditor.tsx +12 -2
- package/src/components/JsonLdScript.astro +9 -0
- package/src/components/LiveSearch.astro +40 -4
- package/src/components/index.ts +4 -0
- package/src/components/live-search-routing.ts +30 -0
- package/src/components/portable-text-text-align.ts +15 -0
- package/src/ui.ts +2 -0
- package/dist/entity-aliases-Egjmqc7I.mjs +0 -51
- package/dist/import-CvHY6sf5.mjs +0 -684
- package/dist/runner-B-tbV751.mjs +0 -2741
- package/dist/schema-B6zyB-Xn.mjs +0 -8
- package/dist/taxonomies-CNOGeC-3.mjs +0 -327
- package/dist/types-eu5UDgHN.d.mts +0 -652
- package/dist/version-xlzMSXF2.mjs +0 -6
- /package/dist/{adapters-OQCImOL7.d.mts → adapters-NVSs4UH7.d.mts} +0 -0
- /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-2r7OWi_I.mjs} +0 -0
- /package/dist/{base64-C1Q9yr0B.mjs → base64-F8-DUraK.mjs} +0 -0
- /package/dist/{challenge-store-CRSz-Xim.mjs → challenge-store-Bjlepa2E.mjs} +0 -0
- /package/dist/{components--pg6zBvu.mjs → components-Bclf98Be.mjs} +0 -0
- /package/dist/{context-types-DQh_XKkn.mjs → context-types-DqTo6C79.mjs} +0 -0
- /package/dist/{default-B6iaLvP7.mjs → default--K40jqm0.mjs} +0 -0
- /package/dist/{email-console-BOVqIYpB.mjs → email-console-ChgKFO8-.mjs} +0 -0
- /package/dist/{escape-BDgouFFY.mjs → escape-Bd4P_xKg.mjs} +0 -0
- /package/dist/{experimental-workflows-Dh4DUoD_.mjs → experimental-workflows-BMsUnIAw.mjs} +0 -0
- /package/dist/{mime-8pAB8-77.mjs → mime-CA7Lgovc.mjs} +0 -0
- /package/dist/{mode-CpyEz8pe.mjs → mode-C4CIyjtR.mjs} +0 -0
- /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CNoXafF7.mjs} +0 -0
- /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-Ygw4bNyt.mjs} +0 -0
- /package/dist/{options-BvJoSSJR.mjs → options-DQPTH5n0.mjs} +0 -0
- /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-BUwu8BA3.mjs} +0 -0
- /package/dist/{patterns-r-0n824Y.mjs → patterns-BhAvqO0S.mjs} +0 -0
- /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-D0w9dqjm.mjs} +0 -0
- /package/dist/{redirect-BjIBtDWY.mjs → redirect-wphRBv4y.mjs} +0 -0
- /package/dist/{request-cache-CYMbwZc6.mjs → request-cache-D9GQBxMP.mjs} +0 -0
- /package/dist/{resolve-DTuDyYKs.mjs → resolve-Cb6Dbz-C.mjs} +0 -0
- /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-CoyjILvW.mjs} +0 -0
- /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-C3mqXg4C.mjs} +0 -0
- /package/dist/{slugify-BzGxlOFx.mjs → slugify-KSsVD_D3.mjs} +0 -0
- /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-DWe8jwAp.mjs} +0 -0
- /package/dist/{transaction-CShMWIej.mjs → transaction-C2EOMTJA.mjs} +0 -0
- /package/dist/{transport-BnsNxh2l.d.mts → transport-CcJu3Co8.d.mts} +0 -0
- /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-DTXQ2IMv.mjs} +0 -0
- /package/dist/{types-BO8TGjS8.mjs → types-B3t5cxhU.mjs} +0 -0
- /package/dist/{types-nP9vGUFq.d.mts → types-C46EvNdc.d.mts} +0 -0
- /package/dist/{types-Cg276-3z.mjs → types-C5CVgwsV.mjs} +0 -0
- /package/dist/{types-DZpT-PnG.d.mts → types-POH8PQZh.d.mts} +0 -0
- /package/dist/{types-Dryvv7LH.d.mts → types-Rc3gQqqw.d.mts} +0 -0
- /package/dist/{url-w7Mp5qAD.mjs → url-CpyFDFpO.mjs} +0 -0
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
import { a as __exportAll } from "./runner-DB7CRfOF.mjs";
|
|
2
|
+
import { t as capabilitiesToDeclaredAccess } from "./types-4garmdWa.mjs";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { imageSize } from "image-size";
|
|
5
|
+
import { createWriteStream } from "node:fs";
|
|
6
|
+
import { basename, extname, join, resolve } from "node:path";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
import { defineCommand } from "citty";
|
|
9
|
+
import consola from "consola";
|
|
10
|
+
import { access, copyFile, mkdir, readFile, readdir, rm, stat, symlink, writeFile } from "node:fs/promises";
|
|
11
|
+
import { pipeline } from "node:stream/promises";
|
|
12
|
+
import { packTar } from "modern-tar/fs";
|
|
13
|
+
|
|
14
|
+
//#region src/cli/commands/bundle-utils.ts
|
|
15
|
+
/**
|
|
16
|
+
* Bundle utility functions
|
|
17
|
+
*
|
|
18
|
+
* Shared logic extracted from the bundle command so it can be tested
|
|
19
|
+
* without the CLI harness and tsdown dependency.
|
|
20
|
+
*/
|
|
21
|
+
const MAX_BUNDLE_SIZE = 256 * 1024;
|
|
22
|
+
const MAX_FILE_SIZE = 128 * 1024;
|
|
23
|
+
const MAX_FILE_COUNT = 20;
|
|
24
|
+
const MAX_SCREENSHOTS = 5;
|
|
25
|
+
const MAX_SCREENSHOT_WIDTH = 1920;
|
|
26
|
+
const MAX_SCREENSHOT_HEIGHT = 1080;
|
|
27
|
+
const ICON_SIZE = 256;
|
|
28
|
+
function toFileImportSpecifier(filePath) {
|
|
29
|
+
return pathToFileURL(filePath).href;
|
|
30
|
+
}
|
|
31
|
+
/** Matches Node.js built-in imports in bundled output. */
|
|
32
|
+
const NODE_BUILTIN_IMPORT_RE = /(?:import|export|require)\s*(?:\(|[^(]*?\bfrom\s+)["'](?:node:)?([a-z_]+)(?:\/[^"']*)?\s*["']\)?/g;
|
|
33
|
+
const LEADING_DOT_SLASH_RE = /^\.\//;
|
|
34
|
+
const DIST_PREFIX_RE = /^dist\//;
|
|
35
|
+
const MJS_EXT_RE = /\.m?js$/;
|
|
36
|
+
const BUILD_OUTPUT_EXT_RE = /\.(?:mjs|js|cjs)$/;
|
|
37
|
+
const TS_TO_TSX_RE = /\.ts$/;
|
|
38
|
+
/** Node.js built-in modules that shouldn't appear in sandbox code */
|
|
39
|
+
const NODE_BUILTINS = new Set([
|
|
40
|
+
"assert",
|
|
41
|
+
"buffer",
|
|
42
|
+
"child_process",
|
|
43
|
+
"cluster",
|
|
44
|
+
"crypto",
|
|
45
|
+
"dgram",
|
|
46
|
+
"dns",
|
|
47
|
+
"domain",
|
|
48
|
+
"events",
|
|
49
|
+
"fs",
|
|
50
|
+
"http",
|
|
51
|
+
"http2",
|
|
52
|
+
"https",
|
|
53
|
+
"inspector",
|
|
54
|
+
"module",
|
|
55
|
+
"net",
|
|
56
|
+
"os",
|
|
57
|
+
"path",
|
|
58
|
+
"perf_hooks",
|
|
59
|
+
"process",
|
|
60
|
+
"punycode",
|
|
61
|
+
"querystring",
|
|
62
|
+
"readline",
|
|
63
|
+
"repl",
|
|
64
|
+
"stream",
|
|
65
|
+
"string_decoder",
|
|
66
|
+
"sys",
|
|
67
|
+
"timers",
|
|
68
|
+
"tls",
|
|
69
|
+
"trace_events",
|
|
70
|
+
"tty",
|
|
71
|
+
"url",
|
|
72
|
+
"util",
|
|
73
|
+
"v8",
|
|
74
|
+
"vm",
|
|
75
|
+
"wasi",
|
|
76
|
+
"worker_threads",
|
|
77
|
+
"zlib"
|
|
78
|
+
]);
|
|
79
|
+
async function fileExists(path) {
|
|
80
|
+
try {
|
|
81
|
+
await access(path);
|
|
82
|
+
return true;
|
|
83
|
+
} catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Read image dimensions from a buffer.
|
|
89
|
+
* Returns [width, height] or null if the format is unrecognized.
|
|
90
|
+
*/
|
|
91
|
+
function readImageDimensions(buf) {
|
|
92
|
+
try {
|
|
93
|
+
const result = imageSize(buf);
|
|
94
|
+
if (result.width != null && result.height != null) return [result.width, result.height];
|
|
95
|
+
return null;
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extract manifest metadata from a ResolvedPlugin.
|
|
102
|
+
* Strips functions (hooks, route handlers) and keeps only serializable metadata.
|
|
103
|
+
*/
|
|
104
|
+
function extractManifest(plugin) {
|
|
105
|
+
const hooks = [];
|
|
106
|
+
for (const [name, resolved] of Object.entries(plugin.hooks)) {
|
|
107
|
+
if (!resolved) continue;
|
|
108
|
+
if (resolved.exclusive || resolved.priority !== 100 || resolved.timeout !== 5e3) {
|
|
109
|
+
const entry = { name };
|
|
110
|
+
if (resolved.exclusive) entry.exclusive = true;
|
|
111
|
+
if (resolved.priority !== 100) entry.priority = resolved.priority;
|
|
112
|
+
if (resolved.timeout !== 5e3) entry.timeout = resolved.timeout;
|
|
113
|
+
hooks.push(entry);
|
|
114
|
+
} else hooks.push(name);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
id: plugin.id,
|
|
118
|
+
version: plugin.version,
|
|
119
|
+
declaredAccess: capabilitiesToDeclaredAccess(plugin.capabilities, plugin.allowedHosts),
|
|
120
|
+
capabilities: plugin.capabilities,
|
|
121
|
+
allowedHosts: plugin.allowedHosts,
|
|
122
|
+
storage: plugin.storage,
|
|
123
|
+
hooks,
|
|
124
|
+
routes: Object.keys(plugin.routes),
|
|
125
|
+
admin: {
|
|
126
|
+
settingsSchema: plugin.admin.settingsSchema,
|
|
127
|
+
pages: plugin.admin.pages,
|
|
128
|
+
widgets: plugin.admin.widgets
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Scan bundled code for Node.js built-in imports.
|
|
134
|
+
* Matches require("node:xxx"), require("xxx"), import("node:xxx") — the patterns
|
|
135
|
+
* that appear in bundled ESM/CJS output (not source-level named imports).
|
|
136
|
+
* Returns deduplicated array of built-in module names found.
|
|
137
|
+
*/
|
|
138
|
+
function findNodeBuiltinImports(code) {
|
|
139
|
+
const found = [];
|
|
140
|
+
NODE_BUILTIN_IMPORT_RE.lastIndex = 0;
|
|
141
|
+
let match;
|
|
142
|
+
while ((match = NODE_BUILTIN_IMPORT_RE.exec(code)) !== null) {
|
|
143
|
+
const mod = match[1];
|
|
144
|
+
if (NODE_BUILTINS.has(mod)) found.push(mod);
|
|
145
|
+
}
|
|
146
|
+
return [...new Set(found)];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Find a build output file by base name, checking common extensions.
|
|
150
|
+
* tsdown may output .mjs, .js, or .cjs depending on format and config.
|
|
151
|
+
*/
|
|
152
|
+
async function findBuildOutput(dir, baseName) {
|
|
153
|
+
const normalizedBaseName = baseName.replace(BUILD_OUTPUT_EXT_RE, "");
|
|
154
|
+
for (const ext of [
|
|
155
|
+
".mjs",
|
|
156
|
+
".js",
|
|
157
|
+
".cjs"
|
|
158
|
+
]) {
|
|
159
|
+
const candidate = join(dir, `${normalizedBaseName}${ext}`);
|
|
160
|
+
if (await fileExists(candidate)) return candidate;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Resolve a dist/built path back to its source .ts/.tsx equivalent.
|
|
165
|
+
* E.g., "./dist/index.mjs" → "src/index.ts"
|
|
166
|
+
*/
|
|
167
|
+
async function resolveSourceEntry(pluginDir, distPath) {
|
|
168
|
+
const cleaned = distPath.replace(LEADING_DOT_SLASH_RE, "");
|
|
169
|
+
const srcPath = cleaned.replace(DIST_PREFIX_RE, "src/").replace(MJS_EXT_RE, ".ts");
|
|
170
|
+
const srcFull = resolve(pluginDir, srcPath);
|
|
171
|
+
if (await fileExists(srcFull)) return srcFull;
|
|
172
|
+
const tsxFull = resolve(pluginDir, srcPath.replace(TS_TO_TSX_RE, ".tsx"));
|
|
173
|
+
if (await fileExists(tsxFull)) return tsxFull;
|
|
174
|
+
const direct = resolve(pluginDir, cleaned);
|
|
175
|
+
if (await fileExists(direct)) return direct;
|
|
176
|
+
}
|
|
177
|
+
const TS_SOURCE_EXPORT_RE = /\.(?:ts|tsx|mts|cts|jsx)$/;
|
|
178
|
+
/**
|
|
179
|
+
* Find package.json exports that point to source files instead of built output.
|
|
180
|
+
* Returns an array of `{ exportPath, resolvedPath }` for each offending export.
|
|
181
|
+
*/
|
|
182
|
+
function findSourceExports(exports) {
|
|
183
|
+
const issues = [];
|
|
184
|
+
for (const [exportPath, exportValue] of Object.entries(exports)) {
|
|
185
|
+
const resolved = typeof exportValue === "string" ? exportValue : exportValue && typeof exportValue === "object" && "import" in exportValue ? exportValue.import : null;
|
|
186
|
+
if (resolved && TS_SOURCE_EXPORT_RE.test(resolved)) issues.push({
|
|
187
|
+
exportPath,
|
|
188
|
+
resolvedPath: resolved
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return issues;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Recursively walk a staging directory and return all regular files with
|
|
195
|
+
* tarball-relative names.
|
|
196
|
+
*/
|
|
197
|
+
async function collectBundleEntries(dir) {
|
|
198
|
+
const entries = [];
|
|
199
|
+
await walkBundle(dir, "", entries);
|
|
200
|
+
return entries;
|
|
201
|
+
}
|
|
202
|
+
async function walkBundle(dir, prefix, into) {
|
|
203
|
+
const items = await readdir(dir, { withFileTypes: true });
|
|
204
|
+
for (const item of items) {
|
|
205
|
+
const fullPath = join(dir, item.name);
|
|
206
|
+
const relPath = prefix ? `${prefix}/${item.name}` : item.name;
|
|
207
|
+
if (item.isFile()) {
|
|
208
|
+
const s = await stat(fullPath);
|
|
209
|
+
into.push({
|
|
210
|
+
name: relPath,
|
|
211
|
+
bytes: s.size
|
|
212
|
+
});
|
|
213
|
+
} else if (item.isDirectory()) await walkBundle(fullPath, relPath, into);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function totalBundleBytes(entries) {
|
|
217
|
+
let total = 0;
|
|
218
|
+
for (const entry of entries) total += entry.bytes;
|
|
219
|
+
return total;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Enforce sandboxed plugin caps against decompressed bundle files:
|
|
223
|
+
* total size, per-file size, and file count.
|
|
224
|
+
*/
|
|
225
|
+
function validateBundleSize(entries) {
|
|
226
|
+
const violations = [];
|
|
227
|
+
const total = totalBundleBytes(entries);
|
|
228
|
+
if (total > MAX_BUNDLE_SIZE) violations.push(`Bundle size ${formatBytes(total)} exceeds maximum of ${formatBytes(MAX_BUNDLE_SIZE)}.`);
|
|
229
|
+
if (entries.length > MAX_FILE_COUNT) violations.push(`Bundle contains ${entries.length} files, exceeds maximum of ${MAX_FILE_COUNT}.`);
|
|
230
|
+
const oversized = entries.filter((entry) => entry.bytes > MAX_FILE_SIZE).toSorted((a, b) => a.name.localeCompare(b.name));
|
|
231
|
+
for (const entry of oversized) violations.push(`File ${entry.name} is ${formatBytes(entry.bytes)}, exceeds per-file maximum of ${formatBytes(MAX_FILE_SIZE)}.`);
|
|
232
|
+
return violations;
|
|
233
|
+
}
|
|
234
|
+
function formatBytes(bytes) {
|
|
235
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
236
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
237
|
+
return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Create a gzipped tarball from a directory.
|
|
241
|
+
*/
|
|
242
|
+
async function createTarball(sourceDir, outputPath) {
|
|
243
|
+
const { createGzip } = await import("node:zlib");
|
|
244
|
+
await pipeline(packTar(sourceDir), createGzip({ level: 9 }), createWriteStream(outputPath));
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
//#endregion
|
|
248
|
+
//#region src/cli/commands/bundle.ts
|
|
249
|
+
/**
|
|
250
|
+
* dineway plugin bundle
|
|
251
|
+
*
|
|
252
|
+
* Produces a publishable plugin tarball from a plugin source directory.
|
|
253
|
+
*
|
|
254
|
+
* Steps:
|
|
255
|
+
* 1. Resolve plugin entrypoint (finds definePlugin() export)
|
|
256
|
+
* 2. Bundle backend code with tsdown → backend.js (single ES module, tree-shaken)
|
|
257
|
+
* 3. Bundle admin code if present → admin.js
|
|
258
|
+
* 4. Extract manifest from definePlugin() → manifest.json
|
|
259
|
+
* 5. Collect assets (README.md, icon.png, screenshots/)
|
|
260
|
+
* 6. Validate bundle (manifest schema, size limits, no Node.js builtins)
|
|
261
|
+
* 7. Create tarball ({id}-{version}.tar.gz)
|
|
262
|
+
*/
|
|
263
|
+
var bundle_exports = /* @__PURE__ */ __exportAll({ bundleCommand: () => bundleCommand });
|
|
264
|
+
const TS_EXT_RE = /\.tsx?$/;
|
|
265
|
+
const SLASH_RE = /\//g;
|
|
266
|
+
const LEADING_AT_RE = /^@/;
|
|
267
|
+
const DINEWAY_SCOPE_RE = /^@dineway-ai\//;
|
|
268
|
+
const bundleCommand = defineCommand({
|
|
269
|
+
meta: {
|
|
270
|
+
name: "bundle",
|
|
271
|
+
description: "Bundle a plugin for marketplace distribution"
|
|
272
|
+
},
|
|
273
|
+
args: {
|
|
274
|
+
dir: {
|
|
275
|
+
type: "string",
|
|
276
|
+
description: "Plugin directory (default: current directory)",
|
|
277
|
+
default: process.cwd()
|
|
278
|
+
},
|
|
279
|
+
outDir: {
|
|
280
|
+
type: "string",
|
|
281
|
+
alias: "o",
|
|
282
|
+
description: "Output directory for the tarball (default: ./dist)",
|
|
283
|
+
default: "dist"
|
|
284
|
+
},
|
|
285
|
+
validateOnly: {
|
|
286
|
+
type: "boolean",
|
|
287
|
+
description: "Run validation only, skip tarball creation",
|
|
288
|
+
default: false
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
async run({ args }) {
|
|
292
|
+
const pluginDir = resolve(args.dir);
|
|
293
|
+
const outDir = resolve(pluginDir, args.outDir);
|
|
294
|
+
const validateOnly = args.validateOnly;
|
|
295
|
+
consola.start(validateOnly ? "Validating plugin..." : "Bundling plugin...");
|
|
296
|
+
const pkgPath = join(pluginDir, "package.json");
|
|
297
|
+
if (!await fileExists(pkgPath)) {
|
|
298
|
+
consola.error("No package.json found in", pluginDir);
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
|
|
302
|
+
let backendEntry;
|
|
303
|
+
let adminEntry;
|
|
304
|
+
if (pkg.exports) {
|
|
305
|
+
const sandboxExport = pkg.exports["./sandbox"];
|
|
306
|
+
if (typeof sandboxExport === "string") backendEntry = await resolveSourceEntry(pluginDir, sandboxExport);
|
|
307
|
+
else if (sandboxExport && typeof sandboxExport === "object" && "import" in sandboxExport) backendEntry = await resolveSourceEntry(pluginDir, sandboxExport.import);
|
|
308
|
+
const adminExport = pkg.exports["./admin"];
|
|
309
|
+
if (typeof adminExport === "string") adminEntry = await resolveSourceEntry(pluginDir, adminExport);
|
|
310
|
+
else if (adminExport && typeof adminExport === "object" && "import" in adminExport) adminEntry = await resolveSourceEntry(pluginDir, adminExport.import);
|
|
311
|
+
}
|
|
312
|
+
if (!backendEntry) {
|
|
313
|
+
const defaultSandbox = join(pluginDir, "src/sandbox-entry.ts");
|
|
314
|
+
if (await fileExists(defaultSandbox)) backendEntry = defaultSandbox;
|
|
315
|
+
}
|
|
316
|
+
let mainEntry;
|
|
317
|
+
if (pkg.exports?.["."] !== void 0) {
|
|
318
|
+
const mainExport = pkg.exports["."];
|
|
319
|
+
if (typeof mainExport === "string") mainEntry = await resolveSourceEntry(pluginDir, mainExport);
|
|
320
|
+
else if (mainExport && typeof mainExport === "object" && "import" in mainExport) mainEntry = await resolveSourceEntry(pluginDir, mainExport.import);
|
|
321
|
+
}
|
|
322
|
+
if (!mainEntry && pkg.main) mainEntry = await resolveSourceEntry(pluginDir, pkg.main);
|
|
323
|
+
if (!mainEntry) {
|
|
324
|
+
const defaultMain = join(pluginDir, "src/index.ts");
|
|
325
|
+
if (await fileExists(defaultMain)) mainEntry = defaultMain;
|
|
326
|
+
}
|
|
327
|
+
if (!mainEntry) {
|
|
328
|
+
consola.error("Cannot find plugin entrypoint. Expected src/index.ts or main/exports in package.json");
|
|
329
|
+
process.exit(1);
|
|
330
|
+
}
|
|
331
|
+
consola.info(`Main entry: ${mainEntry}`);
|
|
332
|
+
if (backendEntry) consola.info(`Backend entry: ${backendEntry}`);
|
|
333
|
+
if (adminEntry) consola.info(`Admin entry: ${adminEntry}`);
|
|
334
|
+
consola.start("Extracting plugin manifest...");
|
|
335
|
+
const { build } = await import("tsdown");
|
|
336
|
+
const tmpDir = join(pluginDir, ".dineway-bundle-tmp");
|
|
337
|
+
try {
|
|
338
|
+
await mkdir(tmpDir, { recursive: true });
|
|
339
|
+
await copyFile(pkgPath, join(tmpDir, "package.json"));
|
|
340
|
+
const mainOutDir = join(tmpDir, "main");
|
|
341
|
+
await build({
|
|
342
|
+
config: false,
|
|
343
|
+
entry: [mainEntry],
|
|
344
|
+
format: "esm",
|
|
345
|
+
outDir: mainOutDir,
|
|
346
|
+
dts: false,
|
|
347
|
+
platform: "node",
|
|
348
|
+
external: ["dineway", DINEWAY_SCOPE_RE]
|
|
349
|
+
});
|
|
350
|
+
const pluginNodeModules = join(pluginDir, "node_modules");
|
|
351
|
+
const tmpNodeModules = join(mainOutDir, "node_modules");
|
|
352
|
+
if (await fileExists(pluginNodeModules)) await symlink(pluginNodeModules, tmpNodeModules, "junction");
|
|
353
|
+
const mainOutputPath = await findBuildOutput(mainOutDir, basename(mainEntry).replace(TS_EXT_RE, ""));
|
|
354
|
+
if (!mainOutputPath) {
|
|
355
|
+
consola.error("Failed to build main entry — no output found in", mainOutDir);
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
const pluginModule = await import(toFileImportSpecifier(mainOutputPath));
|
|
359
|
+
let resolvedPlugin;
|
|
360
|
+
if (typeof pluginModule.createPlugin === "function") resolvedPlugin = pluginModule.createPlugin();
|
|
361
|
+
else if (typeof pluginModule.default === "function") resolvedPlugin = pluginModule.default();
|
|
362
|
+
else if (typeof pluginModule.default === "object" && pluginModule.default !== null) {
|
|
363
|
+
const defaultExport = pluginModule.default;
|
|
364
|
+
if ("id" in defaultExport && "version" in defaultExport) resolvedPlugin = defaultExport;
|
|
365
|
+
}
|
|
366
|
+
if (!resolvedPlugin) for (const [key, value] of Object.entries(pluginModule)) {
|
|
367
|
+
if (key === "default" || typeof value !== "function") continue;
|
|
368
|
+
try {
|
|
369
|
+
const result = value();
|
|
370
|
+
if (result && typeof result === "object" && "id" in result && "version" in result) {
|
|
371
|
+
resolvedPlugin = {
|
|
372
|
+
id: result.id,
|
|
373
|
+
version: result.version,
|
|
374
|
+
capabilities: result.capabilities ?? [],
|
|
375
|
+
allowedHosts: result.allowedHosts ?? [],
|
|
376
|
+
storage: result.storage ?? {},
|
|
377
|
+
hooks: {},
|
|
378
|
+
routes: {},
|
|
379
|
+
admin: {
|
|
380
|
+
pages: result.adminPages,
|
|
381
|
+
widgets: result.adminWidgets
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
if (backendEntry) {
|
|
385
|
+
const backendProbeDir = join(tmpDir, "backend-probe");
|
|
386
|
+
const probeShimDir = join(tmpDir, "probe-shims");
|
|
387
|
+
await mkdir(probeShimDir, { recursive: true });
|
|
388
|
+
await writeFile(join(probeShimDir, "dineway.mjs"), "export const definePlugin = (d) => d;\n");
|
|
389
|
+
await build({
|
|
390
|
+
config: false,
|
|
391
|
+
entry: [backendEntry],
|
|
392
|
+
format: "esm",
|
|
393
|
+
outDir: backendProbeDir,
|
|
394
|
+
dts: false,
|
|
395
|
+
platform: "neutral",
|
|
396
|
+
external: [],
|
|
397
|
+
alias: { dineway: join(probeShimDir, "dineway.mjs") },
|
|
398
|
+
treeshake: true
|
|
399
|
+
});
|
|
400
|
+
const backendProbePath = await findBuildOutput(backendProbeDir, basename(backendEntry).replace(TS_EXT_RE, ""));
|
|
401
|
+
if (backendProbePath) {
|
|
402
|
+
const standardDef = (await import(toFileImportSpecifier(backendProbePath))).default ?? {};
|
|
403
|
+
const hooks = standardDef.hooks;
|
|
404
|
+
const routes = standardDef.routes;
|
|
405
|
+
if (hooks) for (const hookName of Object.keys(hooks)) {
|
|
406
|
+
const hookEntry = hooks[hookName];
|
|
407
|
+
const isConfig = typeof hookEntry === "object" && hookEntry !== null && "handler" in hookEntry;
|
|
408
|
+
const config = isConfig ? hookEntry : {};
|
|
409
|
+
resolvedPlugin.hooks[hookName] = {
|
|
410
|
+
handler: isConfig ? hookEntry.handler : hookEntry,
|
|
411
|
+
priority: config.priority ?? 100,
|
|
412
|
+
timeout: config.timeout ?? 5e3,
|
|
413
|
+
dependencies: config.dependencies ?? [],
|
|
414
|
+
errorPolicy: config.errorPolicy ?? "abort",
|
|
415
|
+
exclusive: config.exclusive ?? false,
|
|
416
|
+
pluginId: result.id
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
if (routes) for (const [name, route] of Object.entries(routes)) {
|
|
420
|
+
const routeObj = route;
|
|
421
|
+
resolvedPlugin.routes[name] = {
|
|
422
|
+
handler: routeObj.handler,
|
|
423
|
+
public: routeObj.public
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
} catch {}
|
|
431
|
+
}
|
|
432
|
+
if (!resolvedPlugin?.id || !resolvedPlugin?.version) {
|
|
433
|
+
consola.error("Could not extract plugin definition. Expected one of:\n - createPlugin() export (native format)\n - Descriptor factory function returning { id, version, ... } (standard format)");
|
|
434
|
+
process.exit(1);
|
|
435
|
+
}
|
|
436
|
+
const manifest = extractManifest(resolvedPlugin);
|
|
437
|
+
if (resolvedPlugin.admin?.entry) {
|
|
438
|
+
consola.error("Plugin declares adminEntry — React admin components require native/trusted mode. Use Block Kit for sandboxed admin pages, or remove adminEntry.");
|
|
439
|
+
process.exit(1);
|
|
440
|
+
}
|
|
441
|
+
if (resolvedPlugin.admin?.portableTextBlocks && resolvedPlugin.admin.portableTextBlocks.length > 0) {
|
|
442
|
+
consola.error("Plugin declares portableTextBlocks — these require native/trusted mode and cannot be bundled for the marketplace.");
|
|
443
|
+
process.exit(1);
|
|
444
|
+
}
|
|
445
|
+
consola.success(`Plugin: ${manifest.id}@${manifest.version}`);
|
|
446
|
+
consola.info(` Capabilities: ${manifest.capabilities.length > 0 ? manifest.capabilities.join(", ") : "(none)"}`);
|
|
447
|
+
consola.info(` Hooks: ${manifest.hooks.length > 0 ? manifest.hooks.map((h) => typeof h === "string" ? h : h.name).join(", ") : "(none)"}`);
|
|
448
|
+
consola.info(` Routes: ${manifest.routes.length > 0 ? manifest.routes.map((r) => typeof r === "string" ? r : r.name).join(", ") : "(none)"}`);
|
|
449
|
+
const bundleDir = join(tmpDir, "bundle");
|
|
450
|
+
await mkdir(bundleDir, { recursive: true });
|
|
451
|
+
if (backendEntry) {
|
|
452
|
+
consola.start("Bundling backend...");
|
|
453
|
+
const shimDir = join(tmpDir, "shims");
|
|
454
|
+
await mkdir(shimDir, { recursive: true });
|
|
455
|
+
await writeFile(join(shimDir, "dineway.mjs"), "export const definePlugin = (d) => d;\n");
|
|
456
|
+
await build({
|
|
457
|
+
config: false,
|
|
458
|
+
entry: [backendEntry],
|
|
459
|
+
format: "esm",
|
|
460
|
+
outDir: join(tmpDir, "backend"),
|
|
461
|
+
dts: false,
|
|
462
|
+
platform: "neutral",
|
|
463
|
+
external: [],
|
|
464
|
+
alias: { dineway: join(shimDir, "dineway.mjs") },
|
|
465
|
+
minify: true,
|
|
466
|
+
treeshake: true
|
|
467
|
+
});
|
|
468
|
+
const backendBaseName = basename(backendEntry).replace(TS_EXT_RE, "");
|
|
469
|
+
const backendOutputPath = await findBuildOutput(join(tmpDir, "backend"), backendBaseName);
|
|
470
|
+
if (backendOutputPath) {
|
|
471
|
+
await copyFile(backendOutputPath, join(bundleDir, "backend.js"));
|
|
472
|
+
consola.success("Built backend.js");
|
|
473
|
+
} else {
|
|
474
|
+
consola.error("Backend build produced no output");
|
|
475
|
+
process.exit(1);
|
|
476
|
+
}
|
|
477
|
+
} else {
|
|
478
|
+
consola.warn("No sandbox entry found — bundle will have no backend.js");
|
|
479
|
+
consola.warn(" Add a \"sandbox-entry.ts\" in src/ or a \"./sandbox\" export in package.json");
|
|
480
|
+
}
|
|
481
|
+
if (adminEntry) {
|
|
482
|
+
consola.start("Bundling admin...");
|
|
483
|
+
await build({
|
|
484
|
+
config: false,
|
|
485
|
+
entry: [adminEntry],
|
|
486
|
+
format: "esm",
|
|
487
|
+
outDir: join(tmpDir, "admin"),
|
|
488
|
+
dts: false,
|
|
489
|
+
platform: "neutral",
|
|
490
|
+
external: [],
|
|
491
|
+
minify: true,
|
|
492
|
+
treeshake: true
|
|
493
|
+
});
|
|
494
|
+
const adminBaseName = basename(adminEntry).replace(TS_EXT_RE, "");
|
|
495
|
+
const adminOutputPath = await findBuildOutput(join(tmpDir, "admin"), adminBaseName);
|
|
496
|
+
if (adminOutputPath) {
|
|
497
|
+
await copyFile(adminOutputPath, join(bundleDir, "admin.js"));
|
|
498
|
+
consola.success("Built admin.js");
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
await writeFile(join(bundleDir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
502
|
+
consola.start("Collecting assets...");
|
|
503
|
+
const readmePath = join(pluginDir, "README.md");
|
|
504
|
+
if (await fileExists(readmePath)) {
|
|
505
|
+
await copyFile(readmePath, join(bundleDir, "README.md"));
|
|
506
|
+
consola.success("Included README.md");
|
|
507
|
+
}
|
|
508
|
+
const iconPath = join(pluginDir, "icon.png");
|
|
509
|
+
if (await fileExists(iconPath)) {
|
|
510
|
+
const dims = readImageDimensions(await readFile(iconPath));
|
|
511
|
+
if (!dims) consola.warn("icon.png is not a valid PNG — skipping");
|
|
512
|
+
else if (dims[0] !== ICON_SIZE || dims[1] !== ICON_SIZE) {
|
|
513
|
+
consola.warn(`icon.png is ${dims[0]}x${dims[1]}, expected ${ICON_SIZE}x${ICON_SIZE} — including anyway`);
|
|
514
|
+
await copyFile(iconPath, join(bundleDir, "icon.png"));
|
|
515
|
+
} else {
|
|
516
|
+
await copyFile(iconPath, join(bundleDir, "icon.png"));
|
|
517
|
+
consola.success("Included icon.png");
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
const screenshotsDir = join(pluginDir, "screenshots");
|
|
521
|
+
if (await fileExists(screenshotsDir)) {
|
|
522
|
+
const screenshotFiles = (await readdir(screenshotsDir)).filter((f) => {
|
|
523
|
+
const ext = extname(f).toLowerCase();
|
|
524
|
+
return ext === ".png" || ext === ".jpg" || ext === ".jpeg";
|
|
525
|
+
}).toSorted().slice(0, MAX_SCREENSHOTS);
|
|
526
|
+
if (screenshotFiles.length > 0) {
|
|
527
|
+
await mkdir(join(bundleDir, "screenshots"), { recursive: true });
|
|
528
|
+
for (const file of screenshotFiles) {
|
|
529
|
+
const filePath = join(screenshotsDir, file);
|
|
530
|
+
const dims = readImageDimensions(await readFile(filePath));
|
|
531
|
+
if (!dims) {
|
|
532
|
+
consola.warn(`screenshots/${file} — cannot read dimensions, skipping`);
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
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`);
|
|
536
|
+
await copyFile(filePath, join(bundleDir, "screenshots", file));
|
|
537
|
+
}
|
|
538
|
+
consola.success(`Included ${screenshotFiles.length} screenshot(s)`);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
consola.start("Validating bundle...");
|
|
542
|
+
let hasErrors = false;
|
|
543
|
+
if (pkg.exports) for (const issue of findSourceExports(pkg.exports)) {
|
|
544
|
+
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.`);
|
|
545
|
+
hasErrors = true;
|
|
546
|
+
}
|
|
547
|
+
const backendPath = join(bundleDir, "backend.js");
|
|
548
|
+
if (await fileExists(backendPath)) {
|
|
549
|
+
const builtins = findNodeBuiltinImports(await readFile(backendPath, "utf-8"));
|
|
550
|
+
if (builtins.length > 0) {
|
|
551
|
+
consola.error(`backend.js imports Node.js built-in modules: ${builtins.join(", ")}`);
|
|
552
|
+
consola.error("Sandboxed plugins cannot use Node.js APIs");
|
|
553
|
+
hasErrors = true;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
if (manifest.capabilities.includes("network:request:unrestricted")) consola.warn("Plugin declares unrestricted network access (network:request:unrestricted) — it can make requests to any host");
|
|
557
|
+
else if (manifest.capabilities.includes("network:request") && manifest.allowedHosts.length === 0) consola.warn("Plugin declares network:request capability but no allowedHosts — all fetch requests will be blocked");
|
|
558
|
+
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");
|
|
559
|
+
if (resolvedPlugin.admin?.entry) consola.warn("Plugin declares admin.entry — custom React components require trusted mode. Use Block Kit for sandboxed admin pages");
|
|
560
|
+
if (resolvedPlugin.hooks["page:fragments"]) consola.warn("Plugin declares page:fragments hook — this is trusted-only and will not work in sandboxed mode");
|
|
561
|
+
const hasAdminPages = (manifest.admin?.pages?.length ?? 0) > 0;
|
|
562
|
+
const hasAdminWidgets = (manifest.admin?.widgets?.length ?? 0) > 0;
|
|
563
|
+
if (hasAdminPages || hasAdminWidgets) {
|
|
564
|
+
if (!manifest.routes.map((r) => typeof r === "string" ? r : r.name).includes("admin")) {
|
|
565
|
+
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.`);
|
|
566
|
+
hasErrors = true;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
const bundleEntries = await collectBundleEntries(bundleDir);
|
|
570
|
+
const sizeViolations = validateBundleSize(bundleEntries);
|
|
571
|
+
if (sizeViolations.length > 0) {
|
|
572
|
+
for (const violation of sizeViolations) consola.error(violation);
|
|
573
|
+
hasErrors = true;
|
|
574
|
+
} else consola.info(`Bundle size: ${formatBytes(totalBundleBytes(bundleEntries))} across ${bundleEntries.length} file${bundleEntries.length === 1 ? "" : "s"}`);
|
|
575
|
+
if (hasErrors) {
|
|
576
|
+
consola.error("Bundle validation failed");
|
|
577
|
+
process.exit(1);
|
|
578
|
+
}
|
|
579
|
+
consola.success("Validation passed");
|
|
580
|
+
if (validateOnly) return;
|
|
581
|
+
await mkdir(outDir, { recursive: true });
|
|
582
|
+
const tarballName = `${manifest.id.replace(SLASH_RE, "-").replace(LEADING_AT_RE, "")}-${manifest.version}.tar.gz`;
|
|
583
|
+
const tarballPath = join(outDir, tarballName);
|
|
584
|
+
consola.start("Creating tarball...");
|
|
585
|
+
await createTarball(bundleDir, tarballPath);
|
|
586
|
+
const tarballSizeKB = ((await stat(tarballPath)).size / 1024).toFixed(1);
|
|
587
|
+
const tarballBuf = await readFile(tarballPath);
|
|
588
|
+
const checksum = createHash("sha256").update(tarballBuf).digest("hex");
|
|
589
|
+
consola.success(`Created ${tarballName} (${tarballSizeKB}KB)`);
|
|
590
|
+
consola.info(` SHA-256: ${checksum}`);
|
|
591
|
+
consola.info(` Path: ${tarballPath}`);
|
|
592
|
+
} finally {
|
|
593
|
+
if (tmpDir.endsWith(".dineway-bundle-tmp")) await rm(tmpDir, {
|
|
594
|
+
recursive: true,
|
|
595
|
+
force: true
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
//#endregion
|
|
602
|
+
export { bundle_exports as n, fileExists as r, bundleCommand as t };
|