dineway 0.1.3 → 0.1.5
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/README.md +6 -3
- package/dist/{apply-CAPvMfoU.mjs → apply-iVSqz2qs.mjs} +132 -39
- package/dist/astro/index.d.mts +18 -9
- package/dist/astro/index.mjs +238 -16
- package/dist/astro/middleware/auth.d.mts +16 -5
- package/dist/astro/middleware/auth.mjs +74 -37
- package/dist/astro/middleware/redirect.mjs +24 -8
- package/dist/astro/middleware/request-context.mjs +18 -5
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.mjs +411 -169
- package/dist/astro/types.d.mts +25 -8
- package/dist/{byline-DeWCMU_i.mjs → byline-OhH2dlRu.mjs} +6 -21
- package/dist/{bylines-DyqBV9EQ.mjs → bylines-BGpD9_hy.mjs} +16 -6
- package/dist/cache-BdSY-gQN.mjs +42 -0
- package/dist/chunks--4F8ddV4.mjs +18 -0
- package/dist/cli/index.mjs +935 -15
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +11 -3
- package/dist/client/index.mjs +4 -3
- package/dist/{connection-C9pxzuag.mjs → connection-BCNICDWN.mjs} +22 -5
- package/dist/{content-zSgdNmnt.mjs → content-DWi4d0rT.mjs} +41 -2
- package/dist/database/instrumentation.d.mts +34 -0
- package/dist/database/instrumentation.mjs +53 -0
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/libsql.mjs +11 -5
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +7 -1
- package/dist/db-errors-CEqD7qH9.mjs +23 -0
- package/dist/{default-WYlzADZL.mjs → default-VjJyuuG9.mjs} +2 -0
- package/dist/{dialect-helpers-B9uSp2GJ.mjs → dialect-helpers-DhTzaUxP.mjs} +3 -0
- package/dist/{error-DrxtnGPg.mjs → error-BmL6QipT.mjs} +7 -3
- package/dist/{index-C-jx21qs.d.mts → index-yvc6E_17.d.mts} +157 -30
- package/dist/index.d.mts +11 -11
- package/dist/index.mjs +24 -22
- package/dist/{loader-qKmo0wAY.mjs → loader-sMG4TZ-u.mjs} +9 -3
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +1 -1
- package/dist/media/local-runtime.d.mts +7 -7
- package/dist/page/index.d.mts +10 -2
- package/dist/page/index.mjs +22 -1
- package/dist/patterns-CrCYkMBb.mjs +92 -0
- package/dist/{placeholder-bOx1xCTY.d.mts → placeholder--wOi4TbO.d.mts} +1 -1
- package/dist/{placeholder-B3knXwNc.mjs → placeholder-Cp8g5Emj.mjs} +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +5 -5
- package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
- package/dist/{query-BiaPl_g2.mjs → query-kDmwCsHh.mjs} +118 -50
- package/dist/{redirect-JPqLAbxa.mjs → redirect-DnEWAkVg.mjs} +43 -99
- package/dist/{registry-DSd1GWB8.mjs → registry-C0zjeB9P.mjs} +191 -123
- package/dist/request-cache-Dk5qPSOx.mjs +66 -0
- package/dist/request-context.d.mts +4 -16
- package/dist/{runner-B5l1JfOj.d.mts → runner-CFI6B6J2.d.mts} +1 -1
- package/dist/{runner-BGUGywgG.mjs → runner-DWZm2KQm.mjs} +589 -137
- package/dist/runtime.d.mts +6 -6
- package/dist/runtime.mjs +2 -2
- package/dist/{search-BNruJHDL.mjs → search-ByRGV2pq.mjs} +570 -424
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +11 -10
- package/dist/seo/index.d.mts +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +11 -3
- package/dist/storage/s3.mjs +78 -15
- package/dist/taxonomies-1s5PaS_8.mjs +266 -0
- package/dist/transaction-Cn2rjY78.mjs +27 -0
- package/dist/{types-BgQeVaPj.d.mts → types-BuMDPy5C.d.mts} +52 -3
- package/dist/{types-DuNbGKjF.mjs → types-COeOq9nK.mjs} +6 -1
- package/dist/{types-ju-_ORz7.d.mts → types-CWbdtiux.d.mts} +13 -5
- package/dist/{types-D38djUXv.d.mts → types-Cj0KMIZV.d.mts} +16 -3
- package/dist/{types-DkvMXalq.d.mts → types-DOrVigru.d.mts} +159 -0
- package/dist/{validate-CXnRKfJK.mjs → validate-BZ5wnLLp.mjs} +2 -1
- package/dist/{validate-DVKJJ-M_.d.mts → validate-IPf8n4Fj.d.mts} +4 -51
- package/dist/{validate-CqRJb_xU.mjs → validate-VPnKoIzW.mjs} +10 -10
- package/dist/version-BKXPsfmJ.mjs +6 -0
- package/package.json +53 -39
- package/src/astro/routes/PluginRegistry.tsx +21 -0
- package/src/astro/routes/admin.astro +99 -0
- package/src/astro/routes/api/admin/allowed-domains/[domain].ts +112 -0
- package/src/astro/routes/api/admin/allowed-domains/index.ts +108 -0
- package/src/astro/routes/api/admin/api-tokens/[id].ts +44 -0
- package/src/astro/routes/api/admin/api-tokens/index.ts +90 -0
- package/src/astro/routes/api/admin/briefing.ts +76 -0
- package/src/astro/routes/api/admin/bylines/[id]/index.ts +90 -0
- package/src/astro/routes/api/admin/bylines/index.ts +74 -0
- package/src/astro/routes/api/admin/comments/[id]/status.ts +120 -0
- package/src/astro/routes/api/admin/comments/[id].ts +64 -0
- package/src/astro/routes/api/admin/comments/bulk.ts +42 -0
- package/src/astro/routes/api/admin/comments/counts.ts +30 -0
- package/src/astro/routes/api/admin/comments/index.ts +46 -0
- package/src/astro/routes/api/admin/context/[id]/history.ts +35 -0
- package/src/astro/routes/api/admin/context/[id]/index.ts +35 -0
- package/src/astro/routes/api/admin/context/[id]/review.ts +57 -0
- package/src/astro/routes/api/admin/context/[id]/supersede.ts +58 -0
- package/src/astro/routes/api/admin/context/diff.ts +35 -0
- package/src/astro/routes/api/admin/context/index.ts +69 -0
- package/src/astro/routes/api/admin/context/stale.ts +35 -0
- package/src/astro/routes/api/admin/hitl-requests/[id]/index.ts +38 -0
- package/src/astro/routes/api/admin/hitl-requests/[id]/resolve.ts +54 -0
- package/src/astro/routes/api/admin/hitl-requests/index.ts +38 -0
- package/src/astro/routes/api/admin/hooks/exclusive/[hookName].ts +132 -0
- package/src/astro/routes/api/admin/hooks/exclusive/index.ts +51 -0
- package/src/astro/routes/api/admin/oauth-clients/[id].ts +137 -0
- package/src/astro/routes/api/admin/oauth-clients/index.ts +95 -0
- package/src/astro/routes/api/admin/plugins/[id]/disable.ts +91 -0
- package/src/astro/routes/api/admin/plugins/[id]/enable.ts +91 -0
- package/src/astro/routes/api/admin/plugins/[id]/index.ts +38 -0
- package/src/astro/routes/api/admin/plugins/[id]/uninstall.ts +98 -0
- package/src/astro/routes/api/admin/plugins/[id]/update.ts +154 -0
- package/src/astro/routes/api/admin/plugins/index.ts +32 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/icon.ts +62 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/index.ts +33 -0
- package/src/astro/routes/api/admin/plugins/marketplace/[id]/install.ts +135 -0
- package/src/astro/routes/api/admin/plugins/marketplace/index.ts +38 -0
- package/src/astro/routes/api/admin/plugins/updates.ts +28 -0
- package/src/astro/routes/api/admin/review-requests/[id]/index.ts +35 -0
- package/src/astro/routes/api/admin/review-requests/[id]/resolve.ts +52 -0
- package/src/astro/routes/api/admin/review-requests/index.ts +35 -0
- package/src/astro/routes/api/admin/themes/marketplace/[id]/index.ts +33 -0
- package/src/astro/routes/api/admin/themes/marketplace/[id]/thumbnail.ts +62 -0
- package/src/astro/routes/api/admin/themes/marketplace/index.ts +45 -0
- package/src/astro/routes/api/admin/users/[id]/disable.ts +72 -0
- package/src/astro/routes/api/admin/users/[id]/enable.ts +48 -0
- package/src/astro/routes/api/admin/users/[id]/index.ts +166 -0
- package/src/astro/routes/api/admin/users/[id]/send-recovery.ts +72 -0
- package/src/astro/routes/api/admin/users/index.ts +66 -0
- package/src/astro/routes/api/auth/dev-bypass.ts +139 -0
- package/src/astro/routes/api/auth/invite/accept.ts +52 -0
- package/src/astro/routes/api/auth/invite/complete.ts +86 -0
- package/src/astro/routes/api/auth/invite/index.ts +99 -0
- package/src/astro/routes/api/auth/invite/register-options.ts +73 -0
- package/src/astro/routes/api/auth/logout.ts +40 -0
- package/src/astro/routes/api/auth/magic-link/send.ts +90 -0
- package/src/astro/routes/api/auth/magic-link/verify.ts +71 -0
- package/src/astro/routes/api/auth/me.ts +60 -0
- package/src/astro/routes/api/auth/oauth/[provider]/callback.ts +221 -0
- package/src/astro/routes/api/auth/oauth/[provider].ts +120 -0
- package/src/astro/routes/api/auth/passkey/[id].ts +124 -0
- package/src/astro/routes/api/auth/passkey/index.ts +54 -0
- package/src/astro/routes/api/auth/passkey/options.ts +85 -0
- package/src/astro/routes/api/auth/passkey/register/options.ts +88 -0
- package/src/astro/routes/api/auth/passkey/register/verify.ts +119 -0
- package/src/astro/routes/api/auth/passkey/verify.ts +72 -0
- package/src/astro/routes/api/auth/signup/complete.ts +87 -0
- package/src/astro/routes/api/auth/signup/request.ts +89 -0
- package/src/astro/routes/api/auth/signup/verify.ts +53 -0
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +310 -0
- package/src/astro/routes/api/content/[collection]/[id]/compare.ts +28 -0
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +68 -0
- package/src/astro/routes/api/content/[collection]/[id]/duplicate.ts +77 -0
- package/src/astro/routes/api/content/[collection]/[id]/permanent.ts +42 -0
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +107 -0
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +100 -0
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +64 -0
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +31 -0
- package/src/astro/routes/api/content/[collection]/[id]/schedule.ts +129 -0
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +143 -0
- package/src/astro/routes/api/content/[collection]/[id]/translations.ts +50 -0
- package/src/astro/routes/api/content/[collection]/[id]/unpublish.ts +69 -0
- package/src/astro/routes/api/content/[collection]/[id].ts +173 -0
- package/src/astro/routes/api/content/[collection]/index.ts +103 -0
- package/src/astro/routes/api/content/[collection]/trash.ts +33 -0
- package/src/astro/routes/api/dashboard.ts +32 -0
- package/src/astro/routes/api/dev/emails.ts +36 -0
- package/src/astro/routes/api/health.ts +54 -0
- package/src/astro/routes/api/import/probe.ts +47 -0
- package/src/astro/routes/api/import/wordpress/analyze.ts +523 -0
- package/src/astro/routes/api/import/wordpress/execute.ts +330 -0
- package/src/astro/routes/api/import/wordpress/media.ts +338 -0
- package/src/astro/routes/api/import/wordpress/prepare.ts +212 -0
- package/src/astro/routes/api/import/wordpress/rewrite-urls.ts +425 -0
- package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +111 -0
- package/src/astro/routes/api/import/wordpress-plugin/callback.ts +58 -0
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +399 -0
- package/src/astro/routes/api/manifest.ts +75 -0
- package/src/astro/routes/api/mcp.ts +125 -0
- package/src/astro/routes/api/media/[id]/confirm.ts +93 -0
- package/src/astro/routes/api/media/[id].ts +145 -0
- package/src/astro/routes/api/media/file/[...key].ts +79 -0
- package/src/astro/routes/api/media/providers/[providerId]/[itemId].ts +91 -0
- package/src/astro/routes/api/media/providers/[providerId]/index.ts +111 -0
- package/src/astro/routes/api/media/providers/index.ts +30 -0
- package/src/astro/routes/api/media/upload-url.ts +146 -0
- package/src/astro/routes/api/media.ts +204 -0
- package/src/astro/routes/api/menus/[name]/items.ts +206 -0
- package/src/astro/routes/api/menus/[name]/reorder.ts +79 -0
- package/src/astro/routes/api/menus/[name].ts +145 -0
- package/src/astro/routes/api/menus/index.ts +91 -0
- package/src/astro/routes/api/oauth/authorize.ts +430 -0
- package/src/astro/routes/api/oauth/device/authorize.ts +45 -0
- package/src/astro/routes/api/oauth/device/code.ts +56 -0
- package/src/astro/routes/api/oauth/device/token.ts +70 -0
- package/src/astro/routes/api/oauth/register.ts +182 -0
- package/src/astro/routes/api/oauth/token/refresh.ts +38 -0
- package/src/astro/routes/api/oauth/token/revoke.ts +38 -0
- package/src/astro/routes/api/oauth/token.ts +195 -0
- package/src/astro/routes/api/openapi.json.ts +33 -0
- package/src/astro/routes/api/plugins/[pluginId]/[...path].ts +109 -0
- package/src/astro/routes/api/redirects/404s/index.ts +72 -0
- package/src/astro/routes/api/redirects/404s/summary.ts +33 -0
- package/src/astro/routes/api/redirects/[id].ts +183 -0
- package/src/astro/routes/api/redirects/index.ts +100 -0
- package/src/astro/routes/api/revisions/[revisionId]/index.ts +29 -0
- package/src/astro/routes/api/revisions/[revisionId]/restore.ts +62 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +104 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +67 -0
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +45 -0
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +107 -0
- package/src/astro/routes/api/schema/collections/index.ts +61 -0
- package/src/astro/routes/api/schema/index.ts +109 -0
- package/src/astro/routes/api/schema/orphans/[slug].ts +36 -0
- package/src/astro/routes/api/schema/orphans/index.ts +26 -0
- package/src/astro/routes/api/search/enable.ts +64 -0
- package/src/astro/routes/api/search/index.ts +52 -0
- package/src/astro/routes/api/search/rebuild.ts +72 -0
- package/src/astro/routes/api/search/stats.ts +35 -0
- package/src/astro/routes/api/search/suggest.ts +50 -0
- package/src/astro/routes/api/sections/[slug].ts +203 -0
- package/src/astro/routes/api/sections/index.ts +107 -0
- package/src/astro/routes/api/settings/email.ts +150 -0
- package/src/astro/routes/api/settings.ts +116 -0
- package/src/astro/routes/api/setup/admin-verify.ts +122 -0
- package/src/astro/routes/api/setup/admin.ts +104 -0
- package/src/astro/routes/api/setup/dev-bypass.ts +200 -0
- package/src/astro/routes/api/setup/dev-reset.ts +40 -0
- package/src/astro/routes/api/setup/index.ts +128 -0
- package/src/astro/routes/api/setup/status.ts +122 -0
- package/src/astro/routes/api/snapshot.ts +76 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/[slug].ts +232 -0
- package/src/astro/routes/api/taxonomies/[name]/terms/index.ts +131 -0
- package/src/astro/routes/api/taxonomies/index.ts +114 -0
- package/src/astro/routes/api/themes/preview.ts +78 -0
- package/src/astro/routes/api/typegen.ts +114 -0
- package/src/astro/routes/api/well-known/auth.ts +71 -0
- package/src/astro/routes/api/well-known/oauth-authorization-server.ts +48 -0
- package/src/astro/routes/api/well-known/oauth-protected-resource.ts +39 -0
- package/src/astro/routes/api/widget-areas/[name]/reorder.ts +114 -0
- package/src/astro/routes/api/widget-areas/[name]/widgets/[id].ts +213 -0
- package/src/astro/routes/api/widget-areas/[name]/widgets.ts +126 -0
- package/src/astro/routes/api/widget-areas/[name].ts +135 -0
- package/src/astro/routes/api/widget-areas/index.ts +149 -0
- package/src/astro/routes/api/widget-components.ts +22 -0
- package/src/astro/routes/robots.txt.ts +81 -0
- package/src/astro/routes/sitemap-[collection].xml.ts +104 -0
- package/src/astro/routes/sitemap.xml.ts +92 -0
- package/src/components/Break.astro +45 -0
- package/src/components/Button.astro +71 -0
- package/src/components/Buttons.astro +49 -0
- package/src/components/Code.astro +59 -0
- package/src/components/Columns.astro +59 -0
- package/src/components/CommentForm.astro +315 -0
- package/src/components/Comments.astro +232 -0
- package/src/components/Cover.astro +128 -0
- package/src/components/DinewayBodyEnd.astro +32 -0
- package/src/components/DinewayBodyStart.astro +32 -0
- package/src/components/DinewayHead.astro +61 -0
- package/src/components/DinewayImage.astro +178 -0
- package/src/components/DinewayMedia.astro +167 -0
- package/src/components/Embed.astro +128 -0
- package/src/components/File.astro +122 -0
- package/src/components/Gallery.astro +93 -0
- package/src/components/HtmlBlock.astro +33 -0
- package/src/components/Image.astro +178 -0
- package/src/components/InlineEditor.astro +27 -0
- package/src/components/InlinePortableTextEditor.tsx +1937 -0
- package/src/components/LiveSearch.astro +614 -0
- package/src/components/PortableText.astro +51 -0
- package/src/components/Pullquote.astro +51 -0
- package/src/components/Table.astro +135 -0
- package/src/components/WidgetArea.astro +22 -0
- package/src/components/WidgetRenderer.astro +72 -0
- package/src/components/index.ts +106 -0
- package/src/components/marks/Link.astro +31 -0
- package/src/components/marks/StrikeThrough.astro +7 -0
- package/src/components/marks/Subscript.astro +7 -0
- package/src/components/marks/Superscript.astro +7 -0
- package/src/components/marks/Underline.astro +7 -0
- package/src/components/marks.ts +19 -0
- package/src/components/widgets/Archives.astro +65 -0
- package/src/components/widgets/Categories.astro +35 -0
- package/src/components/widgets/RecentPosts.astro +51 -0
- package/src/components/widgets/Search.astro +18 -0
- package/src/components/widgets/Tags.astro +38 -0
- package/src/ui.ts +75 -0
- package/LICENSE +0 -9
- /package/dist/{adapters-BlzWJG82.d.mts → adapters-C2ypTrZZ.d.mts} +0 -0
- /package/dist/{config-Cq8H0SfX.mjs → config-BXwuX8Bx.mjs} +0 -0
- /package/dist/{load-C6FCD1FU.mjs → load-Coc9HpHH.mjs} +0 -0
- /package/dist/{manifest-schema-CTSEyIJ3.mjs → manifest-schema-D1MSVnoI.mjs} +0 -0
- /package/dist/{mode-BlyYtIFO.mjs → mode-47goXBBK.mjs} +0 -0
- /package/dist/{tokens-4vgYuXsZ.mjs → tokens-CJz9ubV6.mjs} +0 -0
- /package/dist/{transport-C5FYnid7.mjs → transport-DB5eDN4x.mjs} +0 -0
- /package/dist/{transport-gIL-e43D.d.mts → transport-Wge_IzKl.d.mts} +0 -0
- /package/dist/{types-CLLdsG3g.d.mts → types-BzcUjoqg.d.mts} +0 -0
- /package/dist/{types-DShnjzb6.mjs → types-griIBQOQ.mjs} +0 -0
package/dist/seed/index.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import "../types-
|
|
2
|
-
import { _ as SeedTaxonomyTerm, a as applySeed, b as ValidationResult, c as SeedCollection, d as SeedFile, f as SeedMenu, g as SeedTaxonomy, h as SeedSection, i as defaultSeed, l as SeedContentEntry, m as SeedRedirect, n as loadSeed, o as SeedApplyOptions, p as SeedMenuItem, r as loadUserSeed, s as SeedApplyResult, t as validateSeed, u as SeedField, v as SeedWidget, y as SeedWidgetArea } from "../validate-
|
|
1
|
+
import "../types-DOrVigru.mjs";
|
|
2
|
+
import { _ as SeedTaxonomyTerm, a as applySeed, b as ValidationResult, c as SeedCollection, d as SeedFile, f as SeedMenu, g as SeedTaxonomy, h as SeedSection, i as defaultSeed, l as SeedContentEntry, m as SeedRedirect, n as loadSeed, o as SeedApplyOptions, p as SeedMenuItem, r as loadUserSeed, s as SeedApplyResult, t as validateSeed, u as SeedField, v as SeedWidget, y as SeedWidgetArea } from "../validate-IPf8n4Fj.mjs";
|
|
3
3
|
export { type SeedApplyOptions, type SeedApplyResult, type SeedCollection, type SeedContentEntry, type SeedField, type SeedFile, type SeedMenu, type SeedMenuItem, type SeedRedirect, type SeedSection, type SeedTaxonomy, type SeedTaxonomyTerm, type SeedWidget, type SeedWidgetArea, type ValidationResult, applySeed, defaultSeed, loadSeed, loadUserSeed, validateSeed };
|
package/dist/seed/index.mjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import "../dialect-helpers-
|
|
2
|
-
import "../content-
|
|
1
|
+
import "../dialect-helpers-DhTzaUxP.mjs";
|
|
2
|
+
import "../content-DWi4d0rT.mjs";
|
|
3
3
|
import "../base64-F8-DUraK.mjs";
|
|
4
4
|
import "../types-BawVha09.mjs";
|
|
5
5
|
import "../media-DMTr80Gv.mjs";
|
|
6
|
-
import { t as applySeed } from "../apply-
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import "../
|
|
10
|
-
import "../loader-
|
|
11
|
-
import
|
|
12
|
-
import { t as
|
|
13
|
-
import {
|
|
6
|
+
import { t as applySeed } from "../apply-iVSqz2qs.mjs";
|
|
7
|
+
import "../redirect-DnEWAkVg.mjs";
|
|
8
|
+
import "../byline-OhH2dlRu.mjs";
|
|
9
|
+
import "../registry-C0zjeB9P.mjs";
|
|
10
|
+
import "../loader-sMG4TZ-u.mjs";
|
|
11
|
+
import "../request-cache-Dk5qPSOx.mjs";
|
|
12
|
+
import { t as validateSeed } from "../validate-BZ5wnLLp.mjs";
|
|
13
|
+
import { t as defaultSeed } from "../default-VjJyuuG9.mjs";
|
|
14
|
+
import { n as loadUserSeed, t as loadSeed } from "../load-Coc9HpHH.mjs";
|
|
14
15
|
|
|
15
16
|
export { applySeed, defaultSeed, loadSeed, loadUserSeed, validateSeed };
|
package/dist/seo/index.d.mts
CHANGED
package/dist/storage/local.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ListOptions, d as Storage, l as SignedUploadOptions, o as ListResult, p as UploadResult, r as DownloadResult, s as LocalStorageConfig, u as SignedUploadUrl } from "../types-
|
|
1
|
+
import { a as ListOptions, d as Storage, l as SignedUploadOptions, o as ListResult, p as UploadResult, r as DownloadResult, s as LocalStorageConfig, u as SignedUploadUrl } from "../types-CWbdtiux.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/storage/local.d.ts
|
|
4
4
|
/**
|
package/dist/storage/local.mjs
CHANGED
package/dist/storage/s3.d.mts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import { a as ListOptions, c as S3StorageConfig, d as Storage, l as SignedUploadOptions, o as ListResult, p as UploadResult, r as DownloadResult, u as SignedUploadUrl } from "../types-
|
|
1
|
+
import { a as ListOptions, c as S3StorageConfig, d as Storage, l as SignedUploadOptions, o as ListResult, p as UploadResult, r as DownloadResult, u as SignedUploadUrl } from "../types-CWbdtiux.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/storage/s3.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Merge explicit S3 config with runtime S3_* env vars.
|
|
6
|
+
*
|
|
7
|
+
* Explicit non-empty values win. Env vars are only read for omitted fields,
|
|
8
|
+
* which lets one container image receive credentials at runtime without
|
|
9
|
+
* making malformed env vars override intentional config.
|
|
10
|
+
*/
|
|
11
|
+
declare function resolveS3Config(partial: Record<string, unknown>): S3StorageConfig;
|
|
4
12
|
/**
|
|
5
13
|
* S3-compatible storage implementation
|
|
6
14
|
*/
|
|
@@ -24,8 +32,8 @@ declare class S3Storage implements Storage {
|
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
26
34
|
* Create S3 storage adapter
|
|
27
|
-
* This is the factory function called at runtime
|
|
35
|
+
* This is the factory function called at runtime.
|
|
28
36
|
*/
|
|
29
37
|
declare function createStorage(config: Record<string, unknown>): Storage;
|
|
30
38
|
//#endregion
|
|
31
|
-
export { S3Storage, createStorage };
|
|
39
|
+
export { S3Storage, createStorage, resolveS3Config };
|
package/dist/storage/s3.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as DinewayStorageError } from "../types-
|
|
1
|
+
import { t as DinewayStorageError } from "../types-griIBQOQ.mjs";
|
|
2
2
|
import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
|
|
3
3
|
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
4
4
|
|
|
@@ -9,7 +9,79 @@ import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
|
9
9
|
* Uses the AWS SDK v3 for S3 operations.
|
|
10
10
|
* Works with AWS S3, Cloudflare R2, Minio, and other S3-compatible services.
|
|
11
11
|
*/
|
|
12
|
+
const ENV_KEYS = {
|
|
13
|
+
endpoint: "S3_ENDPOINT",
|
|
14
|
+
bucket: "S3_BUCKET",
|
|
15
|
+
accessKeyId: "S3_ACCESS_KEY_ID",
|
|
16
|
+
secretAccessKey: "S3_SECRET_ACCESS_KEY",
|
|
17
|
+
region: "S3_REGION",
|
|
18
|
+
publicUrl: "S3_PUBLIC_URL"
|
|
19
|
+
};
|
|
12
20
|
const TRAILING_SLASH_PATTERN = /\/$/;
|
|
21
|
+
function failConfig(message) {
|
|
22
|
+
throw new DinewayStorageError(message, "MISSING_S3_CONFIG");
|
|
23
|
+
}
|
|
24
|
+
function isConfigKey(key) {
|
|
25
|
+
return key in ENV_KEYS;
|
|
26
|
+
}
|
|
27
|
+
function getRuntimeEnv(key) {
|
|
28
|
+
if (typeof process === "undefined" || !process.env) return void 0;
|
|
29
|
+
const value = process.env[key];
|
|
30
|
+
return value === "" ? void 0 : value;
|
|
31
|
+
}
|
|
32
|
+
function getPresentExplicitValue(partial, field) {
|
|
33
|
+
const value = partial[field];
|
|
34
|
+
return value === "" ? void 0 : value;
|
|
35
|
+
}
|
|
36
|
+
function isHttpEndpoint(value) {
|
|
37
|
+
try {
|
|
38
|
+
const url = new URL(value);
|
|
39
|
+
return (url.protocol === "http:" || url.protocol === "https:") && url.hostname.length > 0;
|
|
40
|
+
} catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Merge explicit S3 config with runtime S3_* env vars.
|
|
46
|
+
*
|
|
47
|
+
* Explicit non-empty values win. Env vars are only read for omitted fields,
|
|
48
|
+
* which lets one container image receive credentials at runtime without
|
|
49
|
+
* making malformed env vars override intentional config.
|
|
50
|
+
*/
|
|
51
|
+
function resolveS3Config(partial) {
|
|
52
|
+
const merged = {};
|
|
53
|
+
const explicitSources = /* @__PURE__ */ new Set();
|
|
54
|
+
for (const [field, envKey] of Object.entries(ENV_KEYS)) {
|
|
55
|
+
if (!isConfigKey(field)) continue;
|
|
56
|
+
const explicit = getPresentExplicitValue(partial, field);
|
|
57
|
+
if (explicit !== void 0) {
|
|
58
|
+
if (typeof explicit !== "string") failConfig(`s3({ ${field} }) must be a string`);
|
|
59
|
+
merged[field] = explicit;
|
|
60
|
+
explicitSources.add(field);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const envValue = getRuntimeEnv(envKey);
|
|
64
|
+
if (envValue !== void 0) merged[field] = envValue;
|
|
65
|
+
}
|
|
66
|
+
const endpoint = merged.endpoint;
|
|
67
|
+
const bucket = merged.bucket;
|
|
68
|
+
const missing = [];
|
|
69
|
+
if (!endpoint) missing.push("endpoint: set S3_ENDPOINT or pass endpoint to s3({...})");
|
|
70
|
+
if (!bucket) missing.push("bucket: set S3_BUCKET or pass bucket to s3({...})");
|
|
71
|
+
if (!endpoint || !bucket) failConfig(`missing required S3 config: ${missing.join("; ")}`);
|
|
72
|
+
if (!isHttpEndpoint(endpoint)) failConfig(`${explicitSources.has("endpoint") ? "s3({ endpoint })" : ENV_KEYS.endpoint} is not a valid http/https URL`);
|
|
73
|
+
const { accessKeyId, secretAccessKey } = merged;
|
|
74
|
+
if (accessKeyId && !secretAccessKey) failConfig(`S3 credentials incomplete: accessKeyId is set but secretAccessKey is missing (set ${ENV_KEYS.secretAccessKey} or pass secretAccessKey to s3({...}))`);
|
|
75
|
+
if (secretAccessKey && !accessKeyId) failConfig(`S3 credentials incomplete: secretAccessKey is set but accessKeyId is missing (set ${ENV_KEYS.accessKeyId} or pass accessKeyId to s3({...}))`);
|
|
76
|
+
return {
|
|
77
|
+
endpoint,
|
|
78
|
+
bucket,
|
|
79
|
+
accessKeyId,
|
|
80
|
+
secretAccessKey,
|
|
81
|
+
region: merged.region,
|
|
82
|
+
publicUrl: merged.publicUrl
|
|
83
|
+
};
|
|
84
|
+
}
|
|
13
85
|
/** Type guard for AWS SDK errors (have a `name` property) */
|
|
14
86
|
function hasErrorName(error) {
|
|
15
87
|
return error instanceof Error && typeof error.name === "string";
|
|
@@ -29,10 +101,10 @@ var S3Storage = class {
|
|
|
29
101
|
this.client = new S3Client({
|
|
30
102
|
endpoint: config.endpoint,
|
|
31
103
|
region: config.region || "auto",
|
|
32
|
-
credentials: {
|
|
104
|
+
...config.accessKeyId && config.secretAccessKey ? { credentials: {
|
|
33
105
|
accessKeyId: config.accessKeyId,
|
|
34
106
|
secretAccessKey: config.secretAccessKey
|
|
35
|
-
},
|
|
107
|
+
} } : {},
|
|
36
108
|
forcePathStyle: true
|
|
37
109
|
});
|
|
38
110
|
}
|
|
@@ -155,20 +227,11 @@ var S3Storage = class {
|
|
|
155
227
|
};
|
|
156
228
|
/**
|
|
157
229
|
* Create S3 storage adapter
|
|
158
|
-
* This is the factory function called at runtime
|
|
230
|
+
* This is the factory function called at runtime.
|
|
159
231
|
*/
|
|
160
232
|
function createStorage(config) {
|
|
161
|
-
|
|
162
|
-
if (typeof endpoint !== "string" || typeof bucket !== "string" || typeof accessKeyId !== "string" || typeof secretAccessKey !== "string") throw new Error("S3Storage requires 'endpoint', 'bucket', 'accessKeyId', and 'secretAccessKey' string config values");
|
|
163
|
-
return new S3Storage({
|
|
164
|
-
endpoint,
|
|
165
|
-
bucket,
|
|
166
|
-
accessKeyId,
|
|
167
|
-
secretAccessKey,
|
|
168
|
-
region: typeof region === "string" ? region : void 0,
|
|
169
|
-
publicUrl: typeof publicUrl === "string" ? publicUrl : void 0
|
|
170
|
-
});
|
|
233
|
+
return new S3Storage(resolveS3Config(config));
|
|
171
234
|
}
|
|
172
235
|
|
|
173
236
|
//#endregion
|
|
174
|
-
export { S3Storage, createStorage };
|
|
237
|
+
export { S3Storage, createStorage, resolveS3Config };
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-ClPoSABd.mjs";
|
|
2
|
+
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks--4F8ddV4.mjs";
|
|
3
|
+
import { n as getDb } from "./loader-sMG4TZ-u.mjs";
|
|
4
|
+
import { n as requestCached, r as setRequestCacheEntry } from "./request-cache-Dk5qPSOx.mjs";
|
|
5
|
+
import { t as isMissingTableError } from "./db-errors-CEqD7qH9.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/taxonomies/index.ts
|
|
8
|
+
/**
|
|
9
|
+
* Runtime API for taxonomies
|
|
10
|
+
*
|
|
11
|
+
* Provides functions to query taxonomy definitions and terms.
|
|
12
|
+
*/
|
|
13
|
+
var taxonomies_exports = /* @__PURE__ */ __exportAll({
|
|
14
|
+
getAllTermsForEntries: () => getAllTermsForEntries,
|
|
15
|
+
getEntriesByTerm: () => getEntriesByTerm,
|
|
16
|
+
getEntryTerms: () => getEntryTerms,
|
|
17
|
+
getTaxonomyDef: () => getTaxonomyDef,
|
|
18
|
+
getTaxonomyDefs: () => getTaxonomyDefs,
|
|
19
|
+
getTaxonomyTerms: () => getTaxonomyTerms,
|
|
20
|
+
getTerm: () => getTerm,
|
|
21
|
+
getTermsForEntries: () => getTermsForEntries
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Get all taxonomy definitions
|
|
25
|
+
*/
|
|
26
|
+
async function getTaxonomyDefs() {
|
|
27
|
+
return requestCached("taxonomy-defs:all", async () => {
|
|
28
|
+
return (await (await getDb()).selectFrom("_dineway_taxonomy_defs").selectAll().execute()).map((row) => ({
|
|
29
|
+
id: row.id,
|
|
30
|
+
name: row.name,
|
|
31
|
+
label: row.label,
|
|
32
|
+
labelSingular: row.label_singular ?? void 0,
|
|
33
|
+
hierarchical: row.hierarchical === 1,
|
|
34
|
+
collections: row.collections ? JSON.parse(row.collections) : []
|
|
35
|
+
}));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get a single taxonomy definition by name
|
|
40
|
+
*/
|
|
41
|
+
async function getTaxonomyDef(name) {
|
|
42
|
+
return requestCached(`taxonomy-def:${name}`, async () => {
|
|
43
|
+
const row = await (await getDb()).selectFrom("_dineway_taxonomy_defs").selectAll().where("name", "=", name).executeTakeFirst();
|
|
44
|
+
if (!row) return null;
|
|
45
|
+
return {
|
|
46
|
+
id: row.id,
|
|
47
|
+
name: row.name,
|
|
48
|
+
label: row.label,
|
|
49
|
+
labelSingular: row.label_singular ?? void 0,
|
|
50
|
+
hierarchical: row.hierarchical === 1,
|
|
51
|
+
collections: row.collections ? JSON.parse(row.collections) : []
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get all terms for a taxonomy (as tree for hierarchical, flat for tags)
|
|
57
|
+
*/
|
|
58
|
+
async function getTaxonomyTerms(taxonomyName) {
|
|
59
|
+
return requestCached(`taxonomy-terms:${taxonomyName}`, async () => {
|
|
60
|
+
const db = await getDb();
|
|
61
|
+
const def = await getTaxonomyDef(taxonomyName);
|
|
62
|
+
if (!def) return [];
|
|
63
|
+
const rows = await db.selectFrom("taxonomies").selectAll().where("name", "=", taxonomyName).orderBy("label", "asc").execute();
|
|
64
|
+
const countsResult = await db.selectFrom("content_taxonomies").select(["taxonomy_id"]).select((eb) => eb.fn.count("entry_id").as("count")).groupBy("taxonomy_id").execute();
|
|
65
|
+
const counts = /* @__PURE__ */ new Map();
|
|
66
|
+
for (const row of countsResult) counts.set(row.taxonomy_id, row.count);
|
|
67
|
+
const flatTerms = rows.map((row) => ({
|
|
68
|
+
id: row.id,
|
|
69
|
+
name: row.name,
|
|
70
|
+
slug: row.slug,
|
|
71
|
+
label: row.label,
|
|
72
|
+
parent_id: row.parent_id,
|
|
73
|
+
data: row.data
|
|
74
|
+
}));
|
|
75
|
+
if (def.hierarchical) return buildTree(flatTerms, counts);
|
|
76
|
+
return flatTerms.map((term) => ({
|
|
77
|
+
id: term.id,
|
|
78
|
+
name: term.name,
|
|
79
|
+
slug: term.slug,
|
|
80
|
+
label: term.label,
|
|
81
|
+
children: [],
|
|
82
|
+
count: counts.get(term.id) ?? 0
|
|
83
|
+
}));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get a single term by taxonomy and slug
|
|
88
|
+
*/
|
|
89
|
+
async function getTerm(taxonomyName, slug) {
|
|
90
|
+
const db = await getDb();
|
|
91
|
+
const row = await db.selectFrom("taxonomies").selectAll().where("name", "=", taxonomyName).where("slug", "=", slug).executeTakeFirst();
|
|
92
|
+
if (!row) return null;
|
|
93
|
+
const count = (await db.selectFrom("content_taxonomies").select((eb) => eb.fn.count("entry_id").as("count")).where("taxonomy_id", "=", row.id).executeTakeFirst())?.count ?? 0;
|
|
94
|
+
const children = (await db.selectFrom("taxonomies").selectAll().where("parent_id", "=", row.id).orderBy("label", "asc").execute()).map((child) => ({
|
|
95
|
+
id: child.id,
|
|
96
|
+
name: child.name,
|
|
97
|
+
slug: child.slug,
|
|
98
|
+
label: child.label,
|
|
99
|
+
parentId: child.parent_id ?? void 0,
|
|
100
|
+
children: []
|
|
101
|
+
}));
|
|
102
|
+
return {
|
|
103
|
+
id: row.id,
|
|
104
|
+
name: row.name,
|
|
105
|
+
slug: row.slug,
|
|
106
|
+
label: row.label,
|
|
107
|
+
parentId: row.parent_id ?? void 0,
|
|
108
|
+
description: row.data ? JSON.parse(row.data).description : void 0,
|
|
109
|
+
children,
|
|
110
|
+
count
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get terms assigned to an entry
|
|
115
|
+
*/
|
|
116
|
+
function getEntryTerms(collection, entryId, taxonomyName) {
|
|
117
|
+
return requestCached(`terms:${collection}:${entryId}:${taxonomyName ?? "*"}`, async () => {
|
|
118
|
+
let query = (await getDb()).selectFrom("content_taxonomies").innerJoin("taxonomies", "taxonomies.id", "content_taxonomies.taxonomy_id").selectAll("taxonomies").where("content_taxonomies.collection", "=", collection).where("content_taxonomies.entry_id", "=", entryId);
|
|
119
|
+
if (taxonomyName) query = query.where("taxonomies.name", "=", taxonomyName);
|
|
120
|
+
return (await query.execute()).map((row) => ({
|
|
121
|
+
id: row.id,
|
|
122
|
+
name: row.name,
|
|
123
|
+
slug: row.slug,
|
|
124
|
+
label: row.label,
|
|
125
|
+
parentId: row.parent_id ?? void 0,
|
|
126
|
+
children: []
|
|
127
|
+
}));
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get terms for multiple entries in a single query (batched API)
|
|
132
|
+
*
|
|
133
|
+
* This is more efficient than calling getEntryTerms for each entry
|
|
134
|
+
* when you need terms for a list of entries.
|
|
135
|
+
*
|
|
136
|
+
* @param collection - The collection type (e.g., "posts")
|
|
137
|
+
* @param entryIds - Array of entry IDs
|
|
138
|
+
* @param taxonomyName - The taxonomy name (e.g., "categories")
|
|
139
|
+
* @returns Map from entry ID to array of terms
|
|
140
|
+
*/
|
|
141
|
+
async function getTermsForEntries(collection, entryIds, taxonomyName) {
|
|
142
|
+
const result = /* @__PURE__ */ new Map();
|
|
143
|
+
const uniqueIds = [...new Set(entryIds)];
|
|
144
|
+
for (const id of uniqueIds) result.set(id, []);
|
|
145
|
+
if (uniqueIds.length === 0) return result;
|
|
146
|
+
const db = await getDb();
|
|
147
|
+
for (const chunk of chunks(uniqueIds, SQL_BATCH_SIZE)) {
|
|
148
|
+
let rows;
|
|
149
|
+
try {
|
|
150
|
+
rows = await db.selectFrom("content_taxonomies").innerJoin("taxonomies", "taxonomies.id", "content_taxonomies.taxonomy_id").select([
|
|
151
|
+
"content_taxonomies.entry_id",
|
|
152
|
+
"taxonomies.id",
|
|
153
|
+
"taxonomies.name",
|
|
154
|
+
"taxonomies.slug",
|
|
155
|
+
"taxonomies.label",
|
|
156
|
+
"taxonomies.parent_id"
|
|
157
|
+
]).where("content_taxonomies.collection", "=", collection).where("content_taxonomies.entry_id", "in", chunk).where("taxonomies.name", "=", taxonomyName).execute();
|
|
158
|
+
} catch (error) {
|
|
159
|
+
if (isMissingTableError(error)) return result;
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
for (const row of rows) {
|
|
163
|
+
const entryId = row.entry_id;
|
|
164
|
+
const term = {
|
|
165
|
+
id: row.id,
|
|
166
|
+
name: row.name,
|
|
167
|
+
slug: row.slug,
|
|
168
|
+
label: row.label,
|
|
169
|
+
parentId: row.parent_id ?? void 0,
|
|
170
|
+
children: []
|
|
171
|
+
};
|
|
172
|
+
const terms = result.get(entryId);
|
|
173
|
+
if (terms) terms.push(term);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
async function getAllTermsForEntries(collection, entryIds) {
|
|
179
|
+
const result = /* @__PURE__ */ new Map();
|
|
180
|
+
const uniqueIds = [...new Set(entryIds)];
|
|
181
|
+
for (const id of uniqueIds) result.set(id, {});
|
|
182
|
+
if (uniqueIds.length === 0) return result;
|
|
183
|
+
const db = await getDb();
|
|
184
|
+
const applicableTaxonomyNames = await getCollectionTaxonomyNames(collection);
|
|
185
|
+
for (const chunk of chunks(uniqueIds, SQL_BATCH_SIZE)) {
|
|
186
|
+
let rows;
|
|
187
|
+
try {
|
|
188
|
+
rows = await db.selectFrom("content_taxonomies").innerJoin("taxonomies", "taxonomies.id", "content_taxonomies.taxonomy_id").select([
|
|
189
|
+
"content_taxonomies.entry_id",
|
|
190
|
+
"taxonomies.id",
|
|
191
|
+
"taxonomies.name",
|
|
192
|
+
"taxonomies.slug",
|
|
193
|
+
"taxonomies.label",
|
|
194
|
+
"taxonomies.parent_id"
|
|
195
|
+
]).where("content_taxonomies.collection", "=", collection).where("content_taxonomies.entry_id", "in", chunk).orderBy("taxonomies.label", "asc").execute();
|
|
196
|
+
} catch (error) {
|
|
197
|
+
if (isMissingTableError(error)) {
|
|
198
|
+
for (const id of uniqueIds) primeEntryTermsCache(collection, id, {}, applicableTaxonomyNames);
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
for (const row of rows) {
|
|
204
|
+
const entryId = row.entry_id;
|
|
205
|
+
const term = {
|
|
206
|
+
id: row.id,
|
|
207
|
+
name: row.name,
|
|
208
|
+
slug: row.slug,
|
|
209
|
+
label: row.label,
|
|
210
|
+
parentId: row.parent_id ?? void 0,
|
|
211
|
+
children: []
|
|
212
|
+
};
|
|
213
|
+
const byTaxonomy = result.get(entryId);
|
|
214
|
+
if (!byTaxonomy) continue;
|
|
215
|
+
const existing = byTaxonomy[row.name];
|
|
216
|
+
if (existing) existing.push(term);
|
|
217
|
+
else byTaxonomy[row.name] = [term];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
for (const [entryId, byTaxonomy] of result) primeEntryTermsCache(collection, entryId, byTaxonomy, applicableTaxonomyNames);
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
async function getCollectionTaxonomyNames(collection) {
|
|
224
|
+
try {
|
|
225
|
+
return (await getTaxonomyDefs()).filter((def) => def.collections.includes(collection)).map((def) => def.name);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
if (isMissingTableError(error)) return [];
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function primeEntryTermsCache(collection, entryId, byTaxonomy, applicableTaxonomyNames) {
|
|
232
|
+
for (const name of applicableTaxonomyNames) setRequestCacheEntry(`terms:${collection}:${entryId}:${name}`, byTaxonomy[name] ?? []);
|
|
233
|
+
for (const [name, terms] of Object.entries(byTaxonomy)) setRequestCacheEntry(`terms:${collection}:${entryId}:${name}`, terms);
|
|
234
|
+
setRequestCacheEntry(`terms:${collection}:${entryId}:*`, Object.values(byTaxonomy).flat());
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get entries by term (wraps getDinewayCollection)
|
|
238
|
+
*/
|
|
239
|
+
async function getEntriesByTerm(collection, taxonomyName, termSlug) {
|
|
240
|
+
const { getDinewayCollection } = await import("./query-kDmwCsHh.mjs").then((n) => n.o);
|
|
241
|
+
const { entries } = await getDinewayCollection(collection, { where: { [taxonomyName]: termSlug } });
|
|
242
|
+
return entries;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Build tree structure from flat terms
|
|
246
|
+
*/
|
|
247
|
+
function buildTree(flatTerms, counts) {
|
|
248
|
+
const map = /* @__PURE__ */ new Map();
|
|
249
|
+
const roots = [];
|
|
250
|
+
for (const term of flatTerms) map.set(term.id, {
|
|
251
|
+
id: term.id,
|
|
252
|
+
name: term.name,
|
|
253
|
+
slug: term.slug,
|
|
254
|
+
label: term.label,
|
|
255
|
+
parentId: term.parent_id ?? void 0,
|
|
256
|
+
description: term.data ? JSON.parse(term.data).description : void 0,
|
|
257
|
+
children: [],
|
|
258
|
+
count: counts.get(term.id) ?? 0
|
|
259
|
+
});
|
|
260
|
+
for (const term of map.values()) if (term.parentId && map.has(term.parentId)) map.get(term.parentId).children.push(term);
|
|
261
|
+
else roots.push(term);
|
|
262
|
+
return roots;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
//#endregion
|
|
266
|
+
export { getTaxonomyTerms as a, taxonomies_exports as c, getTaxonomyDefs as i, getEntryTerms as n, getTerm as o, getTaxonomyDef as r, getTermsForEntries as s, getEntriesByTerm as t };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/database/transaction.ts
|
|
2
|
+
/**
|
|
3
|
+
* Run a callback inside a transaction if supported, or directly if not.
|
|
4
|
+
*
|
|
5
|
+
* Probes the database once on first call to determine if transactions work.
|
|
6
|
+
* The result is cached for the lifetime of the process/worker.
|
|
7
|
+
*/
|
|
8
|
+
let transactionsSupported = null;
|
|
9
|
+
const TRANSACTIONS_NOT_SUPPORTED_RE = /transactions are not supported/i;
|
|
10
|
+
async function withTransaction(db, fn) {
|
|
11
|
+
if (transactionsSupported === true) return db.transaction().execute(fn);
|
|
12
|
+
if (transactionsSupported === false) return fn(db);
|
|
13
|
+
try {
|
|
14
|
+
const result = await db.transaction().execute(fn);
|
|
15
|
+
transactionsSupported = true;
|
|
16
|
+
return result;
|
|
17
|
+
} catch (error) {
|
|
18
|
+
if (error instanceof Error && TRANSACTIONS_NOT_SUPPORTED_RE.test(error.message)) {
|
|
19
|
+
transactionsSupported = false;
|
|
20
|
+
return fn(db);
|
|
21
|
+
}
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { withTransaction as t };
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/**
|
|
9
9
|
* Supported field types
|
|
10
10
|
*/
|
|
11
|
-
type FieldType = "string" | "text" | "number" | "integer" | "boolean" | "datetime" | "select" | "multiSelect" | "portableText" | "image" | "file" | "reference" | "json" | "slug" | "repeater";
|
|
11
|
+
type FieldType = "string" | "text" | "url" | "number" | "integer" | "boolean" | "datetime" | "select" | "multiSelect" | "portableText" | "image" | "file" | "reference" | "json" | "slug" | "repeater";
|
|
12
12
|
/**
|
|
13
13
|
* SQLite column types that map from field types
|
|
14
14
|
*/
|
|
@@ -31,7 +31,7 @@ type CollectionSource = `template:${string}` | `import:${string}` | "manual" | "
|
|
|
31
31
|
/** Sub-field definition for repeater fields */
|
|
32
32
|
interface RepeaterSubField {
|
|
33
33
|
slug: string;
|
|
34
|
-
type: "string" | "text" | "number" | "integer" | "boolean" | "datetime" | "select";
|
|
34
|
+
type: "string" | "text" | "url" | "number" | "integer" | "boolean" | "datetime" | "select";
|
|
35
35
|
label: string;
|
|
36
36
|
required?: boolean;
|
|
37
37
|
options?: string[];
|
|
@@ -189,4 +189,53 @@ declare const RESERVED_FIELD_SLUGS: string[];
|
|
|
189
189
|
*/
|
|
190
190
|
declare const RESERVED_COLLECTION_SLUGS: string[];
|
|
191
191
|
//#endregion
|
|
192
|
-
|
|
192
|
+
//#region src/settings/types.d.ts
|
|
193
|
+
/**
|
|
194
|
+
* Site Settings Types
|
|
195
|
+
*
|
|
196
|
+
* Global configuration for the site (title, logo, social links, etc.)
|
|
197
|
+
*/
|
|
198
|
+
/** Media reference for logo/favicon */
|
|
199
|
+
interface MediaReference {
|
|
200
|
+
mediaId: string;
|
|
201
|
+
alt?: string;
|
|
202
|
+
/** Resolved media URL returned by getSiteSettings()/getSiteSetting(). */
|
|
203
|
+
url?: string;
|
|
204
|
+
}
|
|
205
|
+
/** Site-level SEO settings */
|
|
206
|
+
interface SeoSettings {
|
|
207
|
+
/** Separator between page title and site title (e.g., " | ", " — ") */
|
|
208
|
+
titleSeparator?: string;
|
|
209
|
+
/** Default OG image when content has no seo_image */
|
|
210
|
+
defaultOgImage?: MediaReference;
|
|
211
|
+
/** Custom robots.txt content. If unset, a default is generated. */
|
|
212
|
+
robotsTxt?: string;
|
|
213
|
+
/** Google Search Console verification meta tag content */
|
|
214
|
+
googleVerification?: string;
|
|
215
|
+
/** Bing Webmaster Tools verification meta tag content */
|
|
216
|
+
bingVerification?: string;
|
|
217
|
+
}
|
|
218
|
+
/** Site settings schema */
|
|
219
|
+
interface SiteSettings {
|
|
220
|
+
title: string;
|
|
221
|
+
tagline?: string;
|
|
222
|
+
logo?: MediaReference;
|
|
223
|
+
favicon?: MediaReference;
|
|
224
|
+
url?: string;
|
|
225
|
+
postsPerPage: number;
|
|
226
|
+
dateFormat: string;
|
|
227
|
+
timezone: string;
|
|
228
|
+
social?: {
|
|
229
|
+
twitter?: string;
|
|
230
|
+
github?: string;
|
|
231
|
+
facebook?: string;
|
|
232
|
+
instagram?: string;
|
|
233
|
+
linkedin?: string;
|
|
234
|
+
youtube?: string;
|
|
235
|
+
};
|
|
236
|
+
seo?: SeoSettings;
|
|
237
|
+
}
|
|
238
|
+
/** Keys that are valid site settings */
|
|
239
|
+
type SiteSettingKey = keyof SiteSettings;
|
|
240
|
+
//#endregion
|
|
241
|
+
export { RESERVED_COLLECTION_SLUGS as _, Collection as a, UpdateFieldInput as b, CollectionWithFields as c, CreateFieldInput as d, FIELD_TYPE_TO_COLUMN as f, FieldWidgetOptions as g, FieldValidation as h, SiteSettings as i, ColumnType as l, FieldType as m, SeoSettings as n, CollectionSource as o, Field as p, SiteSettingKey as r, CollectionSupport as s, MediaReference as t, CreateCollectionInput as u, RESERVED_FIELD_SLUGS as v, UpdateCollectionInput as y };
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const FIELD_TYPES = [
|
|
6
6
|
"string",
|
|
7
7
|
"text",
|
|
8
|
+
"url",
|
|
8
9
|
"number",
|
|
9
10
|
"integer",
|
|
10
11
|
"boolean",
|
|
@@ -25,6 +26,7 @@ const FIELD_TYPES = [
|
|
|
25
26
|
const FIELD_TYPE_TO_COLUMN = {
|
|
26
27
|
string: "TEXT",
|
|
27
28
|
text: "TEXT",
|
|
29
|
+
url: "TEXT",
|
|
28
30
|
number: "REAL",
|
|
29
31
|
integer: "INTEGER",
|
|
30
32
|
boolean: "INTEGER",
|
|
@@ -55,7 +57,10 @@ const RESERVED_FIELD_SLUGS = [
|
|
|
55
57
|
"deleted_at",
|
|
56
58
|
"version",
|
|
57
59
|
"live_revision_id",
|
|
58
|
-
"draft_revision_id"
|
|
60
|
+
"draft_revision_id",
|
|
61
|
+
"terms",
|
|
62
|
+
"bylines",
|
|
63
|
+
"byline"
|
|
59
64
|
];
|
|
60
65
|
/**
|
|
61
66
|
* Reserved collection slugs that cannot be used
|
|
@@ -13,11 +13,19 @@ interface S3StorageConfig {
|
|
|
13
13
|
endpoint: string;
|
|
14
14
|
/** Bucket name */
|
|
15
15
|
bucket: string;
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
/**
|
|
17
|
+
* AWS access key ID.
|
|
18
|
+
* May be resolved from `S3_ACCESS_KEY_ID` at runtime on Node.
|
|
19
|
+
* Must be provided together with `secretAccessKey`, or both omitted.
|
|
20
|
+
*/
|
|
21
|
+
accessKeyId?: string;
|
|
22
|
+
/**
|
|
23
|
+
* AWS secret access key.
|
|
24
|
+
* May be resolved from `S3_SECRET_ACCESS_KEY` at runtime on Node.
|
|
25
|
+
* Must be provided together with `accessKeyId`, or both omitted.
|
|
26
|
+
*/
|
|
27
|
+
secretAccessKey?: string;
|
|
28
|
+
/** Optional region (defaults to "auto") */
|
|
21
29
|
region?: string;
|
|
22
30
|
/** Optional public URL prefix for generated URLs (e.g., CDN URL) */
|
|
23
31
|
publicUrl?: string;
|