dineway 0.1.14 → 0.1.16
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-B4wp7CrU.mjs → activity-events-DbqJBNaY.mjs} +1 -1
- package/dist/{allowed-origins-C1AKK9AT.mjs → allowed-origins-D85wzUp6.mjs} +1 -1
- package/dist/api/route-utils.d.mts +10 -10
- package/dist/api/route-utils.mjs +15 -15
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +4 -4
- package/dist/{api-BTbpzvBq.mjs → api-B5xMY72-.mjs} +96 -17
- package/dist/{api-tokens-D7UjLbdt.mjs → api-tokens-CMmUPFae.mjs} +1 -1
- package/dist/{apply-Bm5QgdrE.mjs → apply-CGVHi2r7.mjs} +165 -85
- package/dist/astro/index.d.mts +11 -11
- package/dist/astro/index.mjs +3 -3
- package/dist/astro/middleware/auth.d.mts +10 -10
- package/dist/astro/middleware/auth.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +6 -6
- package/dist/astro/middleware/request-context.mjs +4 -4
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.mjs +119 -77
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -5
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -5
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/briefing.mjs +19 -19
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +12 -12
- package/dist/astro/routes/api/admin/bylines/index.mjs +12 -12
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +13 -13
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/bulk.mjs +10 -10
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -6
- package/dist/astro/routes/api/admin/comments/index.mjs +10 -10
- package/dist/astro/routes/api/admin/context/_id_/history.mjs +26 -26
- package/dist/astro/routes/api/admin/context/_id_/index.mjs +26 -26
- package/dist/astro/routes/api/admin/context/_id_/review.mjs +30 -30
- package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +30 -30
- package/dist/astro/routes/api/admin/context/diff.mjs +29 -29
- package/dist/astro/routes/api/admin/context/index.mjs +30 -30
- package/dist/astro/routes/api/admin/context/stale.mjs +29 -29
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +26 -26
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +29 -29
- package/dist/astro/routes/api/admin/hitl-requests/index.mjs +29 -29
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +27 -27
- 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 +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +47 -47
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +40 -40
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +46 -46
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +46 -46
- package/dist/astro/routes/api/admin/plugins/index.mjs +40 -40
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +40 -40
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +46 -46
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +40 -40
- package/dist/astro/routes/api/admin/plugins/updates.mjs +40 -40
- package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +29 -29
- package/dist/astro/routes/api/admin/review-requests/index.mjs +10 -10
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +40 -40
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +40 -40
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +6 -6
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +5 -5
- package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/invite/index.mjs +7 -7
- package/dist/astro/routes/api/auth/invite/register-options.mjs +9 -9
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +9 -9
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +5 -5
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +11 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/complete.mjs +10 -10
- package/dist/astro/routes/api/auth/signup/request.mjs +9 -9
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +14 -14
- 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 +7 -7
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +28 -28
- 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 +10 -10
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +13 -13
- 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 +10 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs +10 -10
- package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
- package/dist/astro/routes/api/dashboard.mjs +9 -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 +10 -10
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +3 -3
- package/dist/astro/routes/api/import/wordpress/execute.mjs +29 -29
- package/dist/astro/routes/api/import/wordpress/media.mjs +7 -7
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +33 -33
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +48 -0
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +124 -0
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +32 -145
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +33 -33
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +277 -91
- package/dist/astro/routes/api/media/_id_/confirm.mjs +6 -6
- package/dist/astro/routes/api/media/_id_.mjs +6 -6
- package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +11 -13
- package/dist/astro/routes/api/media.mjs +18 -18
- package/dist/astro/routes/api/menus/_name_/items.mjs +45 -36
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +34 -31
- package/dist/astro/routes/api/menus/_name_/translations.d.mts +8 -0
- package/dist/astro/routes/api/menus/_name_/translations.mjs +111 -0
- package/dist/astro/routes/api/menus/_name_.mjs +47 -36
- package/dist/astro/routes/api/menus/index.mjs +34 -32
- 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 +3 -3
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +3 -3
- package/dist/astro/routes/api/redirects/404s/index.mjs +12 -12
- package/dist/astro/routes/api/redirects/404s/summary.mjs +12 -12
- package/dist/astro/routes/api/redirects/_id_.mjs +31 -31
- package/dist/astro/routes/api/redirects/index.mjs +31 -31
- 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 +41 -41
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +41 -41
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +41 -41
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +41 -41
- package/dist/astro/routes/api/schema/collections/index.mjs +41 -41
- package/dist/astro/routes/api/schema/index.mjs +6 -6
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +40 -40
- package/dist/astro/routes/api/schema/orphans/index.mjs +40 -40
- package/dist/astro/routes/api/search/enable.mjs +12 -12
- package/dist/astro/routes/api/search/index.mjs +11 -11
- package/dist/astro/routes/api/search/rebuild.mjs +12 -12
- package/dist/astro/routes/api/search/stats.mjs +8 -8
- package/dist/astro/routes/api/search/suggest.mjs +11 -11
- package/dist/astro/routes/api/sections/_slug_.mjs +30 -30
- package/dist/astro/routes/api/sections/index.mjs +30 -30
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +30 -30
- package/dist/astro/routes/api/setup/admin-verify.mjs +12 -12
- package/dist/astro/routes/api/setup/admin.mjs +10 -10
- package/dist/astro/routes/api/setup/dev-bypass.mjs +25 -25
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +26 -26
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +7 -7
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.d.mts +8 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +131 -0
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +49 -41
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +36 -34
- package/dist/astro/routes/api/taxonomies/index.mjs +36 -34
- 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 +29 -29
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +30 -30
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +30 -30
- package/dist/astro/routes/api/widget-areas/_name_.mjs +28 -28
- package/dist/astro/routes/api/widget-areas/index.mjs +30 -30
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +9 -9
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +9 -9
- package/dist/astro/routes/sitemap.xml.mjs +10 -10
- package/dist/astro/types.d.mts +16 -14
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{auth-control-guard-DOZ3UCsP.mjs → auth-control-guard--r6LlNkX.mjs} +1 -1
- package/dist/{authorize-BAdbMCwC.mjs → authorize-wQDmXQJ1.mjs} +1 -1
- package/dist/{briefing-MVYe_Uyf.mjs → briefing-4k6R0KAr.mjs} +7 -7
- package/dist/{briefing-rty4O-wa.mjs → briefing-DM7e2yd3.mjs} +1 -1
- package/dist/{byline-naZxOPSa.mjs → byline-BxAf79s1.mjs} +4 -4
- package/dist/{bylines-DxXzWML_.d.mts → bylines-DE9bfDur.d.mts} +75 -13
- package/dist/{bylines-C4LIBOOO.mjs → bylines-DhCnhR70.mjs} +3 -3
- package/dist/{cache-DEbQ13c9.mjs → cache-inQvbrP5.mjs} +1 -1
- package/dist/{chunks-D_jVet6z.mjs → chunks-vkrCT4Ta.mjs} +7 -1
- package/dist/cli/index.mjs +357 -104
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/{comment-DFO-gWDH.mjs → comment-BmJXz3lc.mjs} +1 -1
- package/dist/{comments--BsZ9pqA.mjs → comments-BW1qFiTa.mjs} +1 -1
- package/dist/{content-CyLkb-qH.mjs → content-DvpMad_N.mjs} +4 -3
- package/dist/{context-DNfcm853.mjs → context-CGbVhAmd.mjs} +2 -2
- package/dist/{context-CNIkMzot.mjs → context-CT44ux1O.mjs} +10 -10
- package/dist/{context-route-helpers-MurhoxWF.mjs → context-route-helpers-CcvSXJtQ.mjs} +1 -1
- package/dist/{dashboard-DqnYU8EU.mjs → dashboard-6gH7SlPM.mjs} +9 -18
- package/dist/database/instrumentation.d.mts +1 -1
- package/dist/database/instrumentation.mjs +14 -4
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{device-flow-BGEH5jfn.mjs → device-flow-DaTBhALC.mjs} +5 -5
- package/dist/{dialect-helpers-DhTzaUxP.mjs → dialect-helpers-TkdbkFad.mjs} +7 -1
- package/dist/{fts-manager-B1pTNEG_.mjs → fts-manager-D7KVeBmg.mjs} +1 -1
- package/dist/{hitl-requests-ChT32Ilo.mjs → hitl-requests-CUnch_4e.mjs} +2 -2
- package/dist/{hitl-route-helpers-CSit54Ru.mjs → hitl-route-helpers-DcUCm57p.mjs} +4 -4
- package/dist/{import-BHRLhXAn.mjs → import-BVqG28WP.mjs} +3 -3
- package/dist/{import-CNcKWTbp.mjs → import-DE2ziezs.mjs} +2 -2
- package/dist/{index-CYfhYgXd.d.mts → index-DpMWSamU.d.mts} +2 -2
- package/dist/{index-EUAWaIxW.d.mts → index-JzJUzE4o.d.mts} +47 -47
- package/dist/index.d.mts +16 -16
- package/dist/index.mjs +65 -65
- package/dist/{jsonld-D2gUY4kA.d.mts → jsonld-BjsoTL5m.d.mts} +2 -2
- package/dist/{loader-PZnPxFLc.mjs → loader-CQFxFOt1.mjs} +2 -2
- package/dist/media/index.d.mts +2 -2
- package/dist/media/index.mjs +2 -2
- package/dist/media/local-runtime.d.mts +12 -12
- package/dist/media/local-runtime.mjs +3 -3
- package/dist/{media-_7Fxdu45.mjs → media-Cg4zc9fq.mjs} +12 -9
- package/dist/media-allowlist-eS3AZ2L_.mjs +26 -0
- package/dist/{menus-DYW_UHjv.mjs → menus-BDW1yIdj.mjs} +80 -87
- package/dist/menus-CwI7DQJ5.mjs +569 -0
- package/dist/mime-DJOFDGux.mjs +35 -0
- package/dist/{oauth-authorization-DxGjiWKL.mjs → oauth-authorization-DcYRiDfi.mjs} +5 -5
- package/dist/{oauth-clients-DxO_NO7k.mjs → oauth-clients-CgKFA-VH.mjs} +2 -2
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +1 -1
- package/dist/{parse-C9106ehs.mjs → parse-BBfZRZYb.mjs} +1 -1
- package/dist/{placeholder-Bh1dfUOd.d.mts → placeholder-DKMMLt42.d.mts} +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +10 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
- package/dist/{plugins-D7-ILNib.mjs → plugins-DKceDtUM.mjs} +9 -7
- package/dist/{preview-DvYRU-Oy.mjs → preview-CIDYFBzd.mjs} +2 -2
- package/dist/{provider-loader-BiQ6lNmf.d.mts → provider-loader-D0F6E2qv.d.mts} +1 -1
- package/dist/{query-CsbOywSY.mjs → query-BtuwuZRd.mjs} +3 -3
- package/dist/{query-B9BO5goQ.mjs → query-CWPxZjGM.mjs} +11 -11
- package/dist/{rate-limit-DmVTHI5v.mjs → rate-limit-GN64_Jaw.mjs} +5 -5
- package/dist/{redirect-CGl64yOX.mjs → redirect-BHo9--Jz.mjs} +3 -3
- package/dist/{redirects-Cgi_cZfN.mjs → redirects-Bc40BgxA.mjs} +4 -4
- package/dist/{redirects-lrlmYXVE.mjs → redirects-xVDvj_yQ.mjs} +68 -15
- package/dist/{registry-C-_hxLqa.mjs → registry-DumDzFDn.mjs} +5 -5
- package/dist/{request-cache-DHMRr2Lf.mjs → request-cache-DmVyQUBh.mjs} +5 -1
- package/dist/request-context.d.mts +19 -1
- package/dist/request-context.mjs +15 -3
- package/dist/{request-meta-DixlNKKa.mjs → request-meta-BVx9KkL-.mjs} +1 -1
- package/dist/{review-requests-C2DIHwlJ.mjs → review-requests-BYuoyse0.mjs} +1 -1
- package/dist/{review-requests-DIyjw-K_.mjs → review-requests-vCw7_3DS.mjs} +1 -1
- package/dist/{runner-BU6Lo1ZS.d.mts → runner-CHR_W79l.d.mts} +1 -1
- package/dist/{runner-DWZm2KQm.mjs → runner-lqEiJbO-.mjs} +496 -181
- package/dist/{runtime-QuuFSlc6.d.mts → runtime-DY_XmE9Y.d.mts} +15 -14
- package/dist/runtime.d.mts +11 -11
- package/dist/runtime.mjs +5 -5
- package/dist/{schema-BECjUhP8.mjs → schema-D1z41cq_.mjs} +1 -1
- package/dist/{search-DqTHQqtV.mjs → search-CPcQGTHW.mjs} +2 -2
- package/dist/{secrets-CkoJ9zN0.mjs → secrets-AFKoqUXj.mjs} +2 -2
- package/dist/{sections-B61OxnfB.mjs → sections-B9RYyf3I.mjs} +2 -2
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +19 -19
- package/dist/seo/index.d.mts +1 -1
- package/dist/{seo-CUQctrog.mjs → seo-BPz1KkCq.mjs} +1 -1
- package/dist/{service-CyOsm0R6.mjs → service-DgiH1Yud.mjs} +2 -2
- package/dist/{settings-Dzgswvg4.mjs → settings-BGCo_c2y.mjs} +1 -1
- package/dist/{settings-DGtLLSaz.mjs → settings-qPzY2KIF.mjs} +4 -4
- package/dist/{setup-complete-BlcGZRYm.mjs → setup-complete-4EiBS1E5.mjs} +1 -1
- package/dist/{site-activity-B8FjLIVh.mjs → site-activity-lsCX_cqp.mjs} +1 -1
- package/dist/{site-context-WBxoD99D.mjs → site-context-DHRIU6x9.mjs} +58 -34
- package/dist/{site-url-BP7k7OCe.mjs → site-url-oyqzZtoL.mjs} +1 -1
- 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-BWmxbumf.mjs +350 -0
- package/dist/taxonomies-aQXvYVPm.mjs +507 -0
- package/dist/taxonomy-DI-0HgKe.mjs +217 -0
- package/dist/{tokens-BOJw-D9F.mjs → tokens-DB4dASZl.mjs} +1 -1
- package/dist/{types-DZPw8Rru.d.mts → types-CYBaBvtm.d.mts} +9 -0
- package/dist/{types-C0mmVRJN.d.mts → types-CsnHvu4J.d.mts} +1 -0
- package/dist/{types-Bs6lTBBW.mjs → types-D1DjBFA9.mjs} +8 -2
- package/dist/{types-Q616b2Hn.d.mts → types-DS5PYew4.d.mts} +1 -1
- package/dist/ui/server-runtime.d.mts +7 -7
- package/dist/ui/server-runtime.mjs +19 -19
- package/dist/{user-CcXq-zoL.mjs → user-2aI21yV1.mjs} +1 -1
- package/dist/{utils-C0ONdBul.mjs → utils-BJF19gfk.mjs} +1 -1
- package/dist/{validate-C7TzfamJ.mjs → validate-B8ZvLeOE.mjs} +12 -8
- package/dist/{validate-BwmQEbu8.d.mts → validate-BQ24E8rK.d.mts} +21 -4
- package/dist/version-HdNieFOD.mjs +6 -0
- package/dist/{widgets-B7DRpZvy.mjs → widgets-Cce2-2fM.mjs} +2 -2
- package/dist/{wordpress-slugs-CnporCYH.mjs → wordpress-slugs-C4EhE6fo.mjs} +1 -1
- package/dist/{zod-generator-DBVP8D0P.mjs → zod-generator-BKhtHT3e.mjs} +3 -3
- package/package.json +5 -5
- package/dist/menus-DS3_5nWY.mjs +0 -312
- package/dist/taxonomies-D2aZGuns.mjs +0 -270
- package/dist/taxonomies-z6Lz91BC.mjs +0 -355
- package/dist/taxonomy-D5cbhc8u.mjs +0 -165
- package/dist/version-B3z9Tv-J.mjs +0 -6
- /package/dist/{adapters-DuLQZhRY.d.mts → adapters-BPzUiHHm.d.mts} +0 -0
- /package/dist/{api-tokens-CPjC3zf8.mjs → api-tokens-B7fvbHM2.mjs} +0 -0
- /package/dist/{base64-Cz-aU0X1.mjs → base64-C1Q9yr0B.mjs} +0 -0
- /package/dist/{challenge-store-DDTbisbf.mjs → challenge-store-anhwVER0.mjs} +0 -0
- /package/dist/{components-BPknylYg.mjs → components-BQiBW_Ji.mjs} +0 -0
- /package/dist/{config-CAMFxGaV.mjs → config-XW5tMrH8.mjs} +0 -0
- /package/dist/{context-types-C-LwdAxx.mjs → context-types-DuiyY6xF.mjs} +0 -0
- /package/dist/{cron-CKxvBrRT.mjs → cron-fV9baRVc.mjs} +0 -0
- /package/dist/{db-errors-DyZkswzF.mjs → db-errors-BnUbfGsK.mjs} +0 -0
- /package/dist/{default-D4ngTpW8.mjs → default-2JDm1rj_.mjs} +0 -0
- /package/dist/{email-console-CuefUXfX.mjs → email-console-_pTim1bU.mjs} +0 -0
- /package/dist/{entity-aliases-C0v-yNET.mjs → entity-aliases-PJV8IxDq.mjs} +0 -0
- /package/dist/{error-BMUPwxgx.mjs → error-Dyf9fGZE.mjs} +0 -0
- /package/dist/{escape-BRVaw1Ai.mjs → escape-Bn168-uP.mjs} +0 -0
- /package/dist/{experimental-workflows-C9X7yblQ.mjs → experimental-workflows-CSRjuEwS.mjs} +0 -0
- /package/dist/{hash-CDX7M0ze.mjs → hash-V8oZo1W2.mjs} +0 -0
- /package/dist/{load-B2XtDw__.mjs → load-BvyvS_76.mjs} +0 -0
- /package/dist/{manifest-schema-CgFJAp0H.mjs → manifest-schema-CU0XL_ZK.mjs} +0 -0
- /package/dist/{mode-DUhxwUhv.mjs → mode-DWw2di1I.mjs} +0 -0
- /package/dist/{normalize-C49G_o1k.mjs → normalize-9GU-bv_T.mjs} +0 -0
- /package/dist/{oauth-state-store-C5UFhzwD.mjs → oauth-state-store-DhifLitQ.mjs} +0 -0
- /package/dist/{oauth-user-lookup-Bi0ek9eM.mjs → oauth-user-lookup-nyXQ2_6Q.mjs} +0 -0
- /package/dist/{options-z8VVg1Ll.mjs → options-BF11H_FD.mjs} +0 -0
- /package/dist/{passkey-config-BRSZx4pW.mjs → passkey-config-DZOjt0Hd.mjs} +0 -0
- /package/dist/{patterns-K0DLqWir.mjs → patterns-CW4n2PQs.mjs} +0 -0
- /package/dist/{placeholder-C2P5fKa4.mjs → placeholder-BJPmhjHP.mjs} +0 -0
- /package/dist/{provider-loader-C21b9OpH.mjs → provider-loader-Decn0Ktc.mjs} +0 -0
- /package/dist/{public-url-Cun8N3NU.mjs → public-url-5fFLJhjh.mjs} +0 -0
- /package/dist/{redirect-COZy-3iY.mjs → redirect-C077gVTf.mjs} +0 -0
- /package/dist/{seo-C007Luwn.mjs → seo-DJoop90w.mjs} +0 -0
- /package/dist/{seo-contributions-B1fWCnqY.mjs → seo-contributions-CQzUjJKY.mjs} +0 -0
- /package/dist/{setup-nonce-BpmLXAuu.mjs → setup-nonce-DN6BHIlP.mjs} +0 -0
- /package/dist/{sidecar-client-B1C6Cf80.mjs → sidecar-client-Dta0AELf.mjs} +0 -0
- /package/dist/{slugify-PDTDtMXp.mjs → slugify-BzGxlOFx.mjs} +0 -0
- /package/dist/{ssrf-DDwRxF6B.mjs → ssrf-BOSGjXxb.mjs} +0 -0
- /package/dist/{transaction-x2tJQ-A1.mjs → transaction-qfqpPVpu.mjs} +0 -0
- /package/dist/{transport-CSyZ02_i.mjs → transport-B3jxvfio.mjs} +0 -0
- /package/dist/{transport-BXe1AM79.d.mts → transport-CyOHECBA.d.mts} +0 -0
- /package/dist/{trusted-proxy-BbaZfkT9.mjs → trusted-proxy-8N8sX1D1.mjs} +0 -0
- /package/dist/{types-DJlpx5Ay.d.mts → types-6N-00csp.d.mts} +0 -0
- /package/dist/{types-BFmjniC2.d.mts → types-B45uSz1j.d.mts} +0 -0
- /package/dist/{types-B7kpsMJ3.d.mts → types-BDm7Ipoq.d.mts} +0 -0
- /package/dist/{types-0Vr68fc2.d.mts → types-BeYn-Yf0.d.mts} +0 -0
- /package/dist/{types-OPs5Q_sX.d.mts → types-D_wGrwiY.d.mts} +0 -0
- /package/dist/{types-DL7Y8D_t.mjs → types-Dz2EKzsX.mjs} +0 -0
- /package/dist/{types-fAInWQDO.mjs → types-iNqHe2-V.mjs} +0 -0
- /package/dist/{url-DNjT2abR.mjs → url-DOS4RGym.mjs} +0 -0
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import { t as TaxonomyRepository } from "./taxonomy-D5cbhc8u.mjs";
|
|
2
|
-
import { c as invalidateTermCache } from "./taxonomies-D2aZGuns.mjs";
|
|
3
|
-
import { ulid } from "ulidx";
|
|
4
|
-
|
|
5
|
-
//#region src/api/handlers/taxonomies.ts
|
|
6
|
-
/** Taxonomy name validation pattern: lowercase alphanumeric + underscores, starts with letter */
|
|
7
|
-
const NAME_PATTERN = /^[a-z][a-z0-9_]*$/;
|
|
8
|
-
/**
|
|
9
|
-
* Build tree structure from flat terms
|
|
10
|
-
*/
|
|
11
|
-
function buildTree(flatTerms) {
|
|
12
|
-
const map = /* @__PURE__ */ new Map();
|
|
13
|
-
const roots = [];
|
|
14
|
-
for (const term of flatTerms) map.set(term.id, term);
|
|
15
|
-
for (const term of flatTerms) if (term.parentId && map.has(term.parentId)) map.get(term.parentId).children.push(term);
|
|
16
|
-
else roots.push(term);
|
|
17
|
-
return roots;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Look up a taxonomy definition by name, returning a NOT_FOUND error if missing.
|
|
21
|
-
*/
|
|
22
|
-
async function requireTaxonomyDef(db, name) {
|
|
23
|
-
const def = await db.selectFrom("_dineway_taxonomy_defs").selectAll().where("name", "=", name).executeTakeFirst();
|
|
24
|
-
if (!def) return {
|
|
25
|
-
success: false,
|
|
26
|
-
error: {
|
|
27
|
-
code: "NOT_FOUND",
|
|
28
|
-
message: `Taxonomy '${name}' not found`
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
return {
|
|
32
|
-
success: true,
|
|
33
|
-
def
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* List all taxonomy definitions
|
|
38
|
-
*/
|
|
39
|
-
async function handleTaxonomyList(db) {
|
|
40
|
-
try {
|
|
41
|
-
return {
|
|
42
|
-
success: true,
|
|
43
|
-
data: { taxonomies: (await db.selectFrom("_dineway_taxonomy_defs").selectAll().execute()).map((row) => ({
|
|
44
|
-
id: row.id,
|
|
45
|
-
name: row.name,
|
|
46
|
-
label: row.label,
|
|
47
|
-
labelSingular: row.label_singular ?? void 0,
|
|
48
|
-
hierarchical: row.hierarchical === 1,
|
|
49
|
-
collections: row.collections ? JSON.parse(row.collections) : []
|
|
50
|
-
})) }
|
|
51
|
-
};
|
|
52
|
-
} catch {
|
|
53
|
-
return {
|
|
54
|
-
success: false,
|
|
55
|
-
error: {
|
|
56
|
-
code: "TAXONOMY_LIST_ERROR",
|
|
57
|
-
message: "Failed to list taxonomies"
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Create a new taxonomy definition
|
|
64
|
-
*/
|
|
65
|
-
async function handleTaxonomyCreate(db, input) {
|
|
66
|
-
try {
|
|
67
|
-
if (!NAME_PATTERN.test(input.name)) return {
|
|
68
|
-
success: false,
|
|
69
|
-
error: {
|
|
70
|
-
code: "VALIDATION_ERROR",
|
|
71
|
-
message: "Taxonomy name must start with a letter and contain only lowercase letters, numbers, and underscores"
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
const collections = [...new Set(input.collections ?? [])];
|
|
75
|
-
if (collections.length > 0) {
|
|
76
|
-
const existingCollections = await db.selectFrom("_dineway_collections").select("slug").where("slug", "in", collections).execute();
|
|
77
|
-
const existingSlugs = new Set(existingCollections.map((c) => c.slug));
|
|
78
|
-
const invalid = collections.filter((c) => !existingSlugs.has(c));
|
|
79
|
-
if (invalid.length > 0) return {
|
|
80
|
-
success: false,
|
|
81
|
-
error: {
|
|
82
|
-
code: "VALIDATION_ERROR",
|
|
83
|
-
message: `Unknown collection(s): ${invalid.join(", ")}`
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
if (await db.selectFrom("_dineway_taxonomy_defs").selectAll().where("name", "=", input.name).executeTakeFirst()) return {
|
|
88
|
-
success: false,
|
|
89
|
-
error: {
|
|
90
|
-
code: "CONFLICT",
|
|
91
|
-
message: `Taxonomy '${input.name}' already exists`
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
const id = ulid();
|
|
95
|
-
await db.insertInto("_dineway_taxonomy_defs").values({
|
|
96
|
-
id,
|
|
97
|
-
name: input.name,
|
|
98
|
-
label: input.label,
|
|
99
|
-
label_singular: null,
|
|
100
|
-
hierarchical: input.hierarchical ? 1 : 0,
|
|
101
|
-
collections: JSON.stringify(collections)
|
|
102
|
-
}).execute();
|
|
103
|
-
return {
|
|
104
|
-
success: true,
|
|
105
|
-
data: { taxonomy: {
|
|
106
|
-
id,
|
|
107
|
-
name: input.name,
|
|
108
|
-
label: input.label,
|
|
109
|
-
hierarchical: input.hierarchical ?? false,
|
|
110
|
-
collections
|
|
111
|
-
} }
|
|
112
|
-
};
|
|
113
|
-
} catch (error) {
|
|
114
|
-
if (error instanceof Error && error.message.includes("UNIQUE constraint failed")) return {
|
|
115
|
-
success: false,
|
|
116
|
-
error: {
|
|
117
|
-
code: "CONFLICT",
|
|
118
|
-
message: `Taxonomy '${input.name}' already exists`
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
return {
|
|
122
|
-
success: false,
|
|
123
|
-
error: {
|
|
124
|
-
code: "TAXONOMY_CREATE_ERROR",
|
|
125
|
-
message: "Failed to create taxonomy"
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* List all terms for a taxonomy (returns tree for hierarchical taxonomies)
|
|
132
|
-
*/
|
|
133
|
-
async function handleTermList(db, taxonomyName) {
|
|
134
|
-
try {
|
|
135
|
-
const lookup = await requireTaxonomyDef(db, taxonomyName);
|
|
136
|
-
if (!lookup.success) return lookup;
|
|
137
|
-
const repo = new TaxonomyRepository(db);
|
|
138
|
-
const terms = await repo.findByName(taxonomyName);
|
|
139
|
-
const counts = await repo.countEntriesForTerms(terms.map((term) => term.id));
|
|
140
|
-
const termData = terms.map((term) => ({
|
|
141
|
-
id: term.id,
|
|
142
|
-
name: term.name,
|
|
143
|
-
slug: term.slug,
|
|
144
|
-
label: term.label,
|
|
145
|
-
parentId: term.parentId,
|
|
146
|
-
description: typeof term.data?.description === "string" ? term.data.description : void 0,
|
|
147
|
-
children: [],
|
|
148
|
-
count: counts.get(term.id) ?? 0
|
|
149
|
-
}));
|
|
150
|
-
return {
|
|
151
|
-
success: true,
|
|
152
|
-
data: { terms: lookup.def.hierarchical === 1 ? buildTree(termData) : termData }
|
|
153
|
-
};
|
|
154
|
-
} catch {
|
|
155
|
-
return {
|
|
156
|
-
success: false,
|
|
157
|
-
error: {
|
|
158
|
-
code: "TERM_LIST_ERROR",
|
|
159
|
-
message: "Failed to list terms"
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Create a new term in a taxonomy
|
|
166
|
-
*/
|
|
167
|
-
async function handleTermCreate(db, taxonomyName, input) {
|
|
168
|
-
try {
|
|
169
|
-
const lookup = await requireTaxonomyDef(db, taxonomyName);
|
|
170
|
-
if (!lookup.success) return lookup;
|
|
171
|
-
const repo = new TaxonomyRepository(db);
|
|
172
|
-
if (await repo.findBySlug(taxonomyName, input.slug)) return {
|
|
173
|
-
success: false,
|
|
174
|
-
error: {
|
|
175
|
-
code: "CONFLICT",
|
|
176
|
-
message: `Term with slug '${input.slug}' already exists in taxonomy '${taxonomyName}'`
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
const term = await repo.create({
|
|
180
|
-
name: taxonomyName,
|
|
181
|
-
slug: input.slug,
|
|
182
|
-
label: input.label,
|
|
183
|
-
parentId: input.parentId ?? void 0,
|
|
184
|
-
data: input.description ? { description: input.description } : void 0
|
|
185
|
-
});
|
|
186
|
-
/* @__PURE__ */ invalidateTermCache();
|
|
187
|
-
return {
|
|
188
|
-
success: true,
|
|
189
|
-
data: { term: {
|
|
190
|
-
id: term.id,
|
|
191
|
-
name: term.name,
|
|
192
|
-
slug: term.slug,
|
|
193
|
-
label: term.label,
|
|
194
|
-
parentId: term.parentId,
|
|
195
|
-
description: typeof term.data?.description === "string" ? term.data.description : void 0
|
|
196
|
-
} }
|
|
197
|
-
};
|
|
198
|
-
} catch {
|
|
199
|
-
return {
|
|
200
|
-
success: false,
|
|
201
|
-
error: {
|
|
202
|
-
code: "TERM_CREATE_ERROR",
|
|
203
|
-
message: "Failed to create term"
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Get a single term by slug
|
|
210
|
-
*/
|
|
211
|
-
async function handleTermGet(db, taxonomyName, termSlug) {
|
|
212
|
-
try {
|
|
213
|
-
const repo = new TaxonomyRepository(db);
|
|
214
|
-
const term = await repo.findBySlug(taxonomyName, termSlug);
|
|
215
|
-
if (!term) return {
|
|
216
|
-
success: false,
|
|
217
|
-
error: {
|
|
218
|
-
code: "NOT_FOUND",
|
|
219
|
-
message: `Term '${termSlug}' not found in taxonomy '${taxonomyName}'`
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
const count = await repo.countEntriesWithTerm(term.id);
|
|
223
|
-
const children = await repo.findChildren(term.id);
|
|
224
|
-
return {
|
|
225
|
-
success: true,
|
|
226
|
-
data: { term: {
|
|
227
|
-
id: term.id,
|
|
228
|
-
name: term.name,
|
|
229
|
-
slug: term.slug,
|
|
230
|
-
label: term.label,
|
|
231
|
-
parentId: term.parentId,
|
|
232
|
-
description: typeof term.data?.description === "string" ? term.data.description : void 0,
|
|
233
|
-
count,
|
|
234
|
-
children: children.map((c) => ({
|
|
235
|
-
id: c.id,
|
|
236
|
-
slug: c.slug,
|
|
237
|
-
label: c.label
|
|
238
|
-
}))
|
|
239
|
-
} }
|
|
240
|
-
};
|
|
241
|
-
} catch {
|
|
242
|
-
return {
|
|
243
|
-
success: false,
|
|
244
|
-
error: {
|
|
245
|
-
code: "TERM_GET_ERROR",
|
|
246
|
-
message: "Failed to get term"
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Update a term
|
|
253
|
-
*/
|
|
254
|
-
async function handleTermUpdate(db, taxonomyName, termSlug, input) {
|
|
255
|
-
try {
|
|
256
|
-
const repo = new TaxonomyRepository(db);
|
|
257
|
-
const term = await repo.findBySlug(taxonomyName, termSlug);
|
|
258
|
-
if (!term) return {
|
|
259
|
-
success: false,
|
|
260
|
-
error: {
|
|
261
|
-
code: "NOT_FOUND",
|
|
262
|
-
message: `Term '${termSlug}' not found in taxonomy '${taxonomyName}'`
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
if (input.slug && input.slug !== termSlug) {
|
|
266
|
-
const existing = await repo.findBySlug(taxonomyName, input.slug);
|
|
267
|
-
if (existing && existing.id !== term.id) return {
|
|
268
|
-
success: false,
|
|
269
|
-
error: {
|
|
270
|
-
code: "CONFLICT",
|
|
271
|
-
message: `Term with slug '${input.slug}' already exists in taxonomy '${taxonomyName}'`
|
|
272
|
-
}
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
const updated = await repo.update(term.id, {
|
|
276
|
-
slug: input.slug,
|
|
277
|
-
label: input.label,
|
|
278
|
-
parentId: input.parentId,
|
|
279
|
-
data: input.description !== void 0 ? { description: input.description } : void 0
|
|
280
|
-
});
|
|
281
|
-
/* @__PURE__ */ invalidateTermCache();
|
|
282
|
-
if (!updated) return {
|
|
283
|
-
success: false,
|
|
284
|
-
error: {
|
|
285
|
-
code: "TERM_UPDATE_ERROR",
|
|
286
|
-
message: "Failed to update term"
|
|
287
|
-
}
|
|
288
|
-
};
|
|
289
|
-
return {
|
|
290
|
-
success: true,
|
|
291
|
-
data: { term: {
|
|
292
|
-
id: updated.id,
|
|
293
|
-
name: updated.name,
|
|
294
|
-
slug: updated.slug,
|
|
295
|
-
label: updated.label,
|
|
296
|
-
parentId: updated.parentId,
|
|
297
|
-
description: typeof updated.data?.description === "string" ? updated.data.description : void 0
|
|
298
|
-
} }
|
|
299
|
-
};
|
|
300
|
-
} catch {
|
|
301
|
-
return {
|
|
302
|
-
success: false,
|
|
303
|
-
error: {
|
|
304
|
-
code: "TERM_UPDATE_ERROR",
|
|
305
|
-
message: "Failed to update term"
|
|
306
|
-
}
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Delete a term
|
|
312
|
-
*/
|
|
313
|
-
async function handleTermDelete(db, taxonomyName, termSlug) {
|
|
314
|
-
try {
|
|
315
|
-
const repo = new TaxonomyRepository(db);
|
|
316
|
-
const term = await repo.findBySlug(taxonomyName, termSlug);
|
|
317
|
-
if (!term) return {
|
|
318
|
-
success: false,
|
|
319
|
-
error: {
|
|
320
|
-
code: "NOT_FOUND",
|
|
321
|
-
message: `Term '${termSlug}' not found in taxonomy '${taxonomyName}'`
|
|
322
|
-
}
|
|
323
|
-
};
|
|
324
|
-
if ((await repo.findChildren(term.id)).length > 0) return {
|
|
325
|
-
success: false,
|
|
326
|
-
error: {
|
|
327
|
-
code: "VALIDATION_ERROR",
|
|
328
|
-
message: "Cannot delete term with children. Delete children first."
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
if (!await repo.delete(term.id)) return {
|
|
332
|
-
success: false,
|
|
333
|
-
error: {
|
|
334
|
-
code: "TERM_DELETE_ERROR",
|
|
335
|
-
message: "Failed to delete term"
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
/* @__PURE__ */ invalidateTermCache();
|
|
339
|
-
return {
|
|
340
|
-
success: true,
|
|
341
|
-
data: { deleted: true }
|
|
342
|
-
};
|
|
343
|
-
} catch {
|
|
344
|
-
return {
|
|
345
|
-
success: false,
|
|
346
|
-
error: {
|
|
347
|
-
code: "TERM_DELETE_ERROR",
|
|
348
|
-
message: "Failed to delete term"
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
//#endregion
|
|
355
|
-
export { handleTermGet as a, handleTermDelete as i, handleTaxonomyList as n, handleTermList as o, handleTermCreate as r, handleTermUpdate as s, handleTaxonomyCreate as t };
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-D_jVet6z.mjs";
|
|
2
|
-
import { ulid } from "ulidx";
|
|
3
|
-
|
|
4
|
-
//#region src/database/repositories/taxonomy.ts
|
|
5
|
-
/**
|
|
6
|
-
* Taxonomy repository for categories, tags, and other classification
|
|
7
|
-
*
|
|
8
|
-
* Taxonomies are hierarchical (via parentId) and can be attached to content entries.
|
|
9
|
-
*/
|
|
10
|
-
var TaxonomyRepository = class {
|
|
11
|
-
constructor(db) {
|
|
12
|
-
this.db = db;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Create a new taxonomy term
|
|
16
|
-
*/
|
|
17
|
-
async create(input) {
|
|
18
|
-
const id = ulid();
|
|
19
|
-
const row = {
|
|
20
|
-
id,
|
|
21
|
-
name: input.name,
|
|
22
|
-
slug: input.slug,
|
|
23
|
-
label: input.label,
|
|
24
|
-
parent_id: input.parentId ?? null,
|
|
25
|
-
data: input.data ? JSON.stringify(input.data) : null
|
|
26
|
-
};
|
|
27
|
-
await this.db.insertInto("taxonomies").values(row).execute();
|
|
28
|
-
const taxonomy = await this.findById(id);
|
|
29
|
-
if (!taxonomy) throw new Error("Failed to create taxonomy");
|
|
30
|
-
return taxonomy;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Find taxonomy by ID
|
|
34
|
-
*/
|
|
35
|
-
async findById(id) {
|
|
36
|
-
const row = await this.db.selectFrom("taxonomies").selectAll().where("id", "=", id).executeTakeFirst();
|
|
37
|
-
return row ? this.rowToTaxonomy(row) : null;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Find taxonomy by name and slug (unique constraint)
|
|
41
|
-
*/
|
|
42
|
-
async findBySlug(name, slug) {
|
|
43
|
-
const row = await this.db.selectFrom("taxonomies").selectAll().where("name", "=", name).where("slug", "=", slug).executeTakeFirst();
|
|
44
|
-
return row ? this.rowToTaxonomy(row) : null;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Get all terms for a taxonomy (e.g., all categories)
|
|
48
|
-
*/
|
|
49
|
-
async findByName(name, options = {}) {
|
|
50
|
-
let query = this.db.selectFrom("taxonomies").selectAll().where("name", "=", name).orderBy("label", "asc");
|
|
51
|
-
if (options.parentId !== void 0) if (options.parentId === null) query = query.where("parent_id", "is", null);
|
|
52
|
-
else query = query.where("parent_id", "=", options.parentId);
|
|
53
|
-
return (await query.execute()).map((row) => this.rowToTaxonomy(row));
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Get children of a taxonomy term
|
|
57
|
-
*/
|
|
58
|
-
async findChildren(parentId) {
|
|
59
|
-
return (await this.db.selectFrom("taxonomies").selectAll().where("parent_id", "=", parentId).orderBy("label", "asc").execute()).map((row) => this.rowToTaxonomy(row));
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Update a taxonomy term
|
|
63
|
-
*/
|
|
64
|
-
async update(id, input) {
|
|
65
|
-
if (!await this.findById(id)) return null;
|
|
66
|
-
const updates = {};
|
|
67
|
-
if (input.slug !== void 0) updates.slug = input.slug;
|
|
68
|
-
if (input.label !== void 0) updates.label = input.label;
|
|
69
|
-
if (input.parentId !== void 0) updates.parent_id = input.parentId;
|
|
70
|
-
if (input.data !== void 0) updates.data = JSON.stringify(input.data);
|
|
71
|
-
if (Object.keys(updates).length > 0) await this.db.updateTable("taxonomies").set(updates).where("id", "=", id).execute();
|
|
72
|
-
return this.findById(id);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Delete a taxonomy term
|
|
76
|
-
*/
|
|
77
|
-
async delete(id) {
|
|
78
|
-
await this.db.deleteFrom("content_taxonomies").where("taxonomy_id", "=", id).execute();
|
|
79
|
-
return ((await this.db.deleteFrom("taxonomies").where("id", "=", id).executeTakeFirst()).numDeletedRows ?? 0) > 0;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Attach a taxonomy term to a content entry
|
|
83
|
-
*/
|
|
84
|
-
async attachToEntry(collection, entryId, taxonomyId) {
|
|
85
|
-
const row = {
|
|
86
|
-
collection,
|
|
87
|
-
entry_id: entryId,
|
|
88
|
-
taxonomy_id: taxonomyId
|
|
89
|
-
};
|
|
90
|
-
await this.db.insertInto("content_taxonomies").values(row).onConflict((oc) => oc.doNothing()).execute();
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Detach a taxonomy term from a content entry
|
|
94
|
-
*/
|
|
95
|
-
async detachFromEntry(collection, entryId, taxonomyId) {
|
|
96
|
-
await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).where("taxonomy_id", "=", taxonomyId).execute();
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Get all taxonomy terms for a content entry
|
|
100
|
-
*/
|
|
101
|
-
async getTermsForEntry(collection, entryId, taxonomyName) {
|
|
102
|
-
let query = this.db.selectFrom("content_taxonomies").innerJoin("taxonomies", "taxonomies.id", "content_taxonomies.taxonomy_id").selectAll("taxonomies").where("content_taxonomies.collection", "=", collection).where("content_taxonomies.entry_id", "=", entryId);
|
|
103
|
-
if (taxonomyName) query = query.where("taxonomies.name", "=", taxonomyName);
|
|
104
|
-
return (await query.execute()).map((row) => this.rowToTaxonomy(row));
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Set all taxonomy terms for a content entry (replaces existing)
|
|
108
|
-
* Uses batch operations to avoid N+1 queries.
|
|
109
|
-
*/
|
|
110
|
-
async setTermsForEntry(collection, entryId, taxonomyName, taxonomyIds) {
|
|
111
|
-
const current = await this.getTermsForEntry(collection, entryId, taxonomyName);
|
|
112
|
-
const currentIds = new Set(current.map((t) => t.id));
|
|
113
|
-
const newIds = new Set(taxonomyIds);
|
|
114
|
-
const toRemove = current.filter((t) => !newIds.has(t.id)).map((t) => t.id);
|
|
115
|
-
if (toRemove.length > 0) await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).where("taxonomy_id", "in", toRemove).execute();
|
|
116
|
-
const toAdd = taxonomyIds.filter((id) => !currentIds.has(id));
|
|
117
|
-
if (toAdd.length > 0) await this.db.insertInto("content_taxonomies").values(toAdd.map((taxonomy_id) => ({
|
|
118
|
-
collection,
|
|
119
|
-
entry_id: entryId,
|
|
120
|
-
taxonomy_id
|
|
121
|
-
}))).onConflict((oc) => oc.doNothing()).execute();
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Remove all taxonomy associations for an entry (use when entry is deleted)
|
|
125
|
-
*/
|
|
126
|
-
async clearEntryTerms(collection, entryId) {
|
|
127
|
-
const result = await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).executeTakeFirst();
|
|
128
|
-
return Number(result.numDeletedRows ?? 0);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Count entries that have a specific taxonomy term
|
|
132
|
-
*/
|
|
133
|
-
async countEntriesWithTerm(taxonomyId) {
|
|
134
|
-
const result = await this.db.selectFrom("content_taxonomies").select((eb) => eb.fn.count("entry_id").as("count")).where("taxonomy_id", "=", taxonomyId).executeTakeFirst();
|
|
135
|
-
return Number(result?.count || 0);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Batch count entries for multiple taxonomy term IDs.
|
|
139
|
-
*/
|
|
140
|
-
async countEntriesForTerms(termIds) {
|
|
141
|
-
if (termIds.length === 0) return /* @__PURE__ */ new Map();
|
|
142
|
-
const counts = /* @__PURE__ */ new Map();
|
|
143
|
-
for (const chunk of chunks(termIds, SQL_BATCH_SIZE)) {
|
|
144
|
-
const rows = await this.db.selectFrom("content_taxonomies").select(["taxonomy_id", (eb) => eb.fn.count("entry_id").as("count")]).where("taxonomy_id", "in", chunk).groupBy("taxonomy_id").execute();
|
|
145
|
-
for (const row of rows) counts.set(row.taxonomy_id, Number(row.count || 0));
|
|
146
|
-
}
|
|
147
|
-
return counts;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Convert database row to Taxonomy object
|
|
151
|
-
*/
|
|
152
|
-
rowToTaxonomy(row) {
|
|
153
|
-
return {
|
|
154
|
-
id: row.id,
|
|
155
|
-
name: row.name,
|
|
156
|
-
slug: row.slug,
|
|
157
|
-
label: row.label,
|
|
158
|
-
parentId: row.parent_id,
|
|
159
|
-
data: row.data ? JSON.parse(row.data) : null
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
//#endregion
|
|
165
|
-
export { TaxonomyRepository as t };
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|