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/client/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as tokenInterceptor, i as devBypassInterceptor, n as createTransport, r as csrfInterceptor, t as Interceptor } from "../transport-
|
|
1
|
+
import { a as tokenInterceptor, i as devBypassInterceptor, n as createTransport, r as csrfInterceptor, t as Interceptor } from "../transport-Wge_IzKl.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/client/portable-text.d.ts
|
|
4
4
|
/**
|
|
@@ -75,6 +75,11 @@ interface ListResult<T> {
|
|
|
75
75
|
items: T[];
|
|
76
76
|
nextCursor?: string;
|
|
77
77
|
}
|
|
78
|
+
/** Options for publishing content. */
|
|
79
|
+
interface PublishContentOptions {
|
|
80
|
+
/** Approved review request ID for token-authenticated publish execution. */
|
|
81
|
+
reviewRequestId?: string;
|
|
82
|
+
}
|
|
78
83
|
/** Content item as returned by the API */
|
|
79
84
|
interface ContentItem {
|
|
80
85
|
id: string;
|
|
@@ -204,6 +209,9 @@ interface SchemaExport {
|
|
|
204
209
|
interface Manifest {
|
|
205
210
|
version: string;
|
|
206
211
|
hash: string;
|
|
212
|
+
features?: {
|
|
213
|
+
siteContextWorkflows: boolean;
|
|
214
|
+
};
|
|
207
215
|
collections: Record<string, {
|
|
208
216
|
label: string;
|
|
209
217
|
labelSingular: string;
|
|
@@ -313,7 +321,7 @@ declare class DinewayClient {
|
|
|
313
321
|
/** Delete (soft) a content item */
|
|
314
322
|
delete(collection: string, id: string): Promise<void>;
|
|
315
323
|
/** Publish a content item */
|
|
316
|
-
publish(collection: string, id: string): Promise<void>;
|
|
324
|
+
publish(collection: string, id: string, options?: PublishContentOptions): Promise<void>;
|
|
317
325
|
/** Unpublish a content item */
|
|
318
326
|
unpublish(collection: string, id: string): Promise<void>;
|
|
319
327
|
/** Schedule publishing */
|
|
@@ -394,4 +402,4 @@ declare class DinewayClient {
|
|
|
394
402
|
private getFieldSchemas;
|
|
395
403
|
}
|
|
396
404
|
//#endregion
|
|
397
|
-
export { ApiError, ClientResponse, Collection, CollectionWithFields, ContentItem, DinewayApiError, DinewayClient, DinewayClientError, DinewayClientOptions, Field, type Interceptor, ListResult, Manifest, MediaItem, Menu, MenuItem, MenuWithItems, type PortableTextBlock, SchemaExport, SearchResult, Taxonomy, Term, createTransport, csrfInterceptor, devBypassInterceptor, markdownToPortableText, portableTextToMarkdown, tokenInterceptor };
|
|
405
|
+
export { ApiError, ClientResponse, Collection, CollectionWithFields, ContentItem, DinewayApiError, DinewayClient, DinewayClientError, DinewayClientOptions, Field, type Interceptor, ListResult, Manifest, MediaItem, Menu, MenuItem, MenuWithItems, type PortableTextBlock, PublishContentOptions, SchemaExport, SearchResult, Taxonomy, Term, createTransport, csrfInterceptor, devBypassInterceptor, markdownToPortableText, portableTextToMarkdown, tokenInterceptor };
|
package/dist/client/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as tokenInterceptor, c as markdownToPortableText, i as refreshInterceptor, l as portableTextToMarkdown, n as csrfInterceptor, o as convertDataForRead, r as devBypassInterceptor, s as convertDataForWrite, t as createTransport } from "../transport-
|
|
1
|
+
import { a as tokenInterceptor, c as markdownToPortableText, i as refreshInterceptor, l as portableTextToMarkdown, n as csrfInterceptor, o as convertDataForRead, r as devBypassInterceptor, s as convertDataForWrite, t as createTransport } from "../transport-DB5eDN4x.mjs";
|
|
2
2
|
import mime from "mime/lite";
|
|
3
3
|
|
|
4
4
|
//#region src/client/index.ts
|
|
@@ -186,8 +186,9 @@ var DinewayClient = class {
|
|
|
186
186
|
await this.request("DELETE", `/content/${encodeURIComponent(collection)}/${encodeURIComponent(id)}`);
|
|
187
187
|
}
|
|
188
188
|
/** Publish a content item */
|
|
189
|
-
async publish(collection, id) {
|
|
190
|
-
|
|
189
|
+
async publish(collection, id, options = {}) {
|
|
190
|
+
const body = options.reviewRequestId ? { reviewRequestId: options.reviewRequestId } : void 0;
|
|
191
|
+
await this.request("POST", `/content/${encodeURIComponent(collection)}/${encodeURIComponent(id)}/publish`, body);
|
|
191
192
|
}
|
|
192
193
|
/** Unpublish a content item */
|
|
193
194
|
async unpublish(collection, id) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { n as __require } from "./chunk-ClPoSABd.mjs";
|
|
2
|
+
import { kyselyLogOption } from "./database/instrumentation.mjs";
|
|
2
3
|
import BetterSqlite3 from "better-sqlite3";
|
|
3
4
|
import { Kysely, SqliteDialect } from "kysely";
|
|
4
5
|
|
|
@@ -18,6 +19,14 @@ var DinewayDatabaseError = class extends Error {
|
|
|
18
19
|
}
|
|
19
20
|
};
|
|
20
21
|
/**
|
|
22
|
+
* Returns a helpful message when better-sqlite3's native binary was compiled
|
|
23
|
+
* against a different Node.js version than the one running.
|
|
24
|
+
*/
|
|
25
|
+
function formatNativeModuleVersionError(error) {
|
|
26
|
+
if (!(error instanceof Error ? error.message : String(error)).includes("NODE_MODULE_VERSION")) return null;
|
|
27
|
+
return "better-sqlite3's native binary was compiled against a different Node.js version. Rebuild it with `pnpm rebuild better-sqlite3` (or `npm rebuild better-sqlite3`), or reinstall dependencies with your current Node.js version.";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
21
30
|
* Creates a Kysely database instance
|
|
22
31
|
* Supports:
|
|
23
32
|
* - file:./path/to/db.sqlite (local SQLite)
|
|
@@ -30,20 +39,28 @@ function createDatabase(config) {
|
|
|
30
39
|
const sqlite = new BetterSqlite3(config.url === ":memory:" ? ":memory:" : config.url.replace("file:", ""));
|
|
31
40
|
sqlite.pragma("journal_mode = WAL");
|
|
32
41
|
sqlite.pragma("foreign_keys = ON");
|
|
33
|
-
return new Kysely({
|
|
42
|
+
return new Kysely({
|
|
43
|
+
dialect: new SqliteDialect({ database: sqlite }),
|
|
44
|
+
log: kyselyLogOption()
|
|
45
|
+
});
|
|
34
46
|
}
|
|
35
47
|
if (LIBSQL_REMOTE_URL_PREFIXES.some((prefix) => config.url.startsWith(prefix))) try {
|
|
36
48
|
const { LibsqlDialect } = __require("@libsql/kysely-libsql");
|
|
37
|
-
return new Kysely({
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
return new Kysely({
|
|
50
|
+
dialect: new LibsqlDialect({
|
|
51
|
+
url: config.url,
|
|
52
|
+
authToken: config.authToken
|
|
53
|
+
}),
|
|
54
|
+
log: kyselyLogOption()
|
|
55
|
+
});
|
|
41
56
|
} catch (error) {
|
|
42
57
|
throw new DinewayDatabaseError("Failed to load libSQL dialect. Install @libsql/kysely-libsql to use remote libSQL databases", error);
|
|
43
58
|
}
|
|
44
59
|
throw new DinewayDatabaseError(`Unsupported database URL scheme: ${config.url}`);
|
|
45
60
|
} catch (error) {
|
|
46
61
|
if (error instanceof DinewayDatabaseError) throw error;
|
|
62
|
+
const nativeVersionHint = formatNativeModuleVersionError(error);
|
|
63
|
+
if (nativeVersionHint) throw new DinewayDatabaseError(nativeVersionHint, error);
|
|
47
64
|
throw new DinewayDatabaseError("Failed to create database", error);
|
|
48
65
|
}
|
|
49
66
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-ClPoSABd.mjs";
|
|
2
|
+
import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
|
|
2
3
|
import { n as decodeCursor, r as encodeCursor, t as DinewayValidationError } from "./types-BawVha09.mjs";
|
|
3
4
|
import { sql } from "kysely";
|
|
4
5
|
import { monotonicFactory, ulid } from "ulidx";
|
|
@@ -11,6 +12,17 @@ const MULTIPLE_HYPHENS_PATTERN = /-+/g;
|
|
|
11
12
|
const LEADING_TRAILING_HYPHEN_PATTERN = /^-|-$/g;
|
|
12
13
|
const TRAILING_HYPHEN_PATTERN = /-$/;
|
|
13
14
|
/**
|
|
15
|
+
* Decode a URI-encoded slug route parameter before database lookup.
|
|
16
|
+
*/
|
|
17
|
+
function decodeSlug(raw) {
|
|
18
|
+
if (!raw) return void 0;
|
|
19
|
+
try {
|
|
20
|
+
return decodeURIComponent(raw);
|
|
21
|
+
} catch {
|
|
22
|
+
return raw;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
14
26
|
* Convert a string to a URL-friendly slug.
|
|
15
27
|
*
|
|
16
28
|
* Handles unicode by normalizing to NFD and stripping diacritics,
|
|
@@ -148,6 +160,7 @@ const SYSTEM_COLUMNS = new Set([
|
|
|
148
160
|
* Get the table name for a collection type
|
|
149
161
|
*/
|
|
150
162
|
function getTableName(type) {
|
|
163
|
+
validateIdentifier(type, "collection type");
|
|
151
164
|
return `ec_${type}`;
|
|
152
165
|
}
|
|
153
166
|
/**
|
|
@@ -236,6 +249,7 @@ var ContentRepository = class {
|
|
|
236
249
|
];
|
|
237
250
|
if (data && typeof data === "object") {
|
|
238
251
|
for (const [key, value] of Object.entries(data)) if (!SYSTEM_COLUMNS.has(key)) {
|
|
252
|
+
validateIdentifier(key, "content field name");
|
|
239
253
|
columns.push(key);
|
|
240
254
|
values.push(serializeValue(value));
|
|
241
255
|
}
|
|
@@ -456,7 +470,10 @@ var ContentRepository = class {
|
|
|
456
470
|
if (input.authorId !== void 0) updates.author_id = input.authorId;
|
|
457
471
|
if (input.primaryBylineId !== void 0) updates.primary_byline_id = input.primaryBylineId;
|
|
458
472
|
if (input.data !== void 0 && typeof input.data === "object") {
|
|
459
|
-
for (const [key, value] of Object.entries(input.data)) if (!SYSTEM_COLUMNS.has(key))
|
|
473
|
+
for (const [key, value] of Object.entries(input.data)) if (!SYSTEM_COLUMNS.has(key)) {
|
|
474
|
+
validateIdentifier(key, "content field name");
|
|
475
|
+
updates[key] = serializeValue(value);
|
|
476
|
+
}
|
|
460
477
|
}
|
|
461
478
|
await this.db.updateTable(tableName).set(updates).where("id", "=", id).where("deleted_at", "is", null).execute();
|
|
462
479
|
const updated = await this.findById(type, id);
|
|
@@ -695,6 +712,27 @@ var ContentRepository = class {
|
|
|
695
712
|
return updated;
|
|
696
713
|
}
|
|
697
714
|
/**
|
|
715
|
+
* Stage an existing revision as the draft for a content item.
|
|
716
|
+
*
|
|
717
|
+
* Seed/import paths use this to promote freshly prepared revision data
|
|
718
|
+
* through `publish()` instead of writing live revision pointers directly.
|
|
719
|
+
*/
|
|
720
|
+
async setDraftRevision(type, id, revisionId) {
|
|
721
|
+
const tableName = getTableName(type);
|
|
722
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
723
|
+
if (!await this.findById(type, id)) throw new DinewayValidationError("Content item not found");
|
|
724
|
+
const revision = await new RevisionRepository(this.db).findById(revisionId);
|
|
725
|
+
if (!revision) throw new DinewayValidationError("Revision not found");
|
|
726
|
+
if (revision.collection !== type || revision.entryId !== id) throw new DinewayValidationError("Revision does not belong to the specified content item");
|
|
727
|
+
await sql`
|
|
728
|
+
UPDATE ${sql.ref(tableName)}
|
|
729
|
+
SET draft_revision_id = ${revisionId},
|
|
730
|
+
updated_at = ${now}
|
|
731
|
+
WHERE id = ${id}
|
|
732
|
+
AND deleted_at IS NULL
|
|
733
|
+
`.execute(this.db);
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
698
736
|
* Unpublish content
|
|
699
737
|
*
|
|
700
738
|
* Removes live pointer but preserves draft. If no draft exists,
|
|
@@ -767,6 +805,7 @@ var ContentRepository = class {
|
|
|
767
805
|
for (const [key, value] of Object.entries(data)) {
|
|
768
806
|
if (SYSTEM_COLUMNS.has(key)) continue;
|
|
769
807
|
if (key.startsWith("_")) continue;
|
|
808
|
+
validateIdentifier(key, "content field name");
|
|
770
809
|
updates[key] = serializeValue(value);
|
|
771
810
|
}
|
|
772
811
|
if (Object.keys(updates).length === 0) return;
|
|
@@ -833,4 +872,4 @@ var ContentRepository = class {
|
|
|
833
872
|
};
|
|
834
873
|
|
|
835
874
|
//#endregion
|
|
836
|
-
export { slugify as i, content_exports as n, RevisionRepository as r, ContentRepository as t };
|
|
875
|
+
export { slugify as a, decodeSlug as i, content_exports as n, RevisionRepository as r, ContentRepository as t };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Logger } from "kysely";
|
|
2
|
+
|
|
3
|
+
//#region src/database/instrumentation.d.ts
|
|
4
|
+
declare const QUERY_LOG_ENV = "DINEWAY_QUERY_LOG";
|
|
5
|
+
declare const QUERY_LOG_PREFIX = "[dineway-query-log]";
|
|
6
|
+
declare const SERVER_TIMING_ENV = "DINEWAY_SERVER_TIMING";
|
|
7
|
+
interface QueryEvent {
|
|
8
|
+
sql: string;
|
|
9
|
+
params: readonly unknown[];
|
|
10
|
+
durationMs: number;
|
|
11
|
+
route: string;
|
|
12
|
+
method: string;
|
|
13
|
+
phase: string;
|
|
14
|
+
}
|
|
15
|
+
interface QueryRecorder {
|
|
16
|
+
events: QueryEvent[];
|
|
17
|
+
route: string;
|
|
18
|
+
method: string;
|
|
19
|
+
phase: string;
|
|
20
|
+
}
|
|
21
|
+
interface ServerTimingMetric {
|
|
22
|
+
name: string;
|
|
23
|
+
dur: number;
|
|
24
|
+
desc?: string;
|
|
25
|
+
}
|
|
26
|
+
declare function createRecorder(route: string, method: string, phase: string): QueryRecorder;
|
|
27
|
+
declare function recordEvent(recorder: QueryRecorder, sql: string, params: readonly unknown[], durationMs: number): void;
|
|
28
|
+
declare function flushRecorder(recorder: QueryRecorder): void;
|
|
29
|
+
declare function isInstrumentationEnabled(): boolean;
|
|
30
|
+
declare function isServerTimingEnabled(): boolean;
|
|
31
|
+
declare function formatServerTimingHeader(metrics: readonly ServerTimingMetric[]): string;
|
|
32
|
+
declare function kyselyLogOption(): Logger | undefined;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { QUERY_LOG_ENV, QUERY_LOG_PREFIX, QueryEvent, QueryRecorder, SERVER_TIMING_ENV, ServerTimingMetric, createRecorder, flushRecorder, formatServerTimingHeader, isInstrumentationEnabled, isServerTimingEnabled, kyselyLogOption, recordEvent };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getRequestContext } from "../request-context.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/database/instrumentation.ts
|
|
4
|
+
const QUERY_LOG_ENV = "DINEWAY_QUERY_LOG";
|
|
5
|
+
const QUERY_LOG_PREFIX = "[dineway-query-log]";
|
|
6
|
+
const SERVER_TIMING_ENV = "DINEWAY_SERVER_TIMING";
|
|
7
|
+
function createRecorder(route, method, phase) {
|
|
8
|
+
return {
|
|
9
|
+
events: [],
|
|
10
|
+
route,
|
|
11
|
+
method,
|
|
12
|
+
phase
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function recordEvent(recorder, sql, params, durationMs) {
|
|
16
|
+
recorder.events.push({
|
|
17
|
+
sql,
|
|
18
|
+
params,
|
|
19
|
+
durationMs,
|
|
20
|
+
route: recorder.route,
|
|
21
|
+
method: recorder.method,
|
|
22
|
+
phase: recorder.phase
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function flushRecorder(recorder) {
|
|
26
|
+
for (const event of recorder.events) console.log(`${QUERY_LOG_PREFIX} ${JSON.stringify(event)}`);
|
|
27
|
+
}
|
|
28
|
+
function isInstrumentationEnabled() {
|
|
29
|
+
return Boolean(typeof process !== "undefined" && process.env && process.env[QUERY_LOG_ENV] === "1");
|
|
30
|
+
}
|
|
31
|
+
function isServerTimingEnabled() {
|
|
32
|
+
return Boolean(typeof process !== "undefined" && process.env && process.env[SERVER_TIMING_ENV] === "1");
|
|
33
|
+
}
|
|
34
|
+
function formatServerTimingHeader(metrics) {
|
|
35
|
+
return metrics.map((metric) => {
|
|
36
|
+
const dur = Math.max(0, Math.round(metric.dur));
|
|
37
|
+
if (!metric.desc) return `${metric.name};dur=${dur}`;
|
|
38
|
+
const desc = metric.desc.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"");
|
|
39
|
+
return `${metric.name};dur=${dur};desc="${desc}"`;
|
|
40
|
+
}).join(", ");
|
|
41
|
+
}
|
|
42
|
+
function kyselyLog(event) {
|
|
43
|
+
if (event.level !== "query") return;
|
|
44
|
+
const recorder = getRequestContext()?.queryRecorder;
|
|
45
|
+
if (!recorder) return;
|
|
46
|
+
recordEvent(recorder, event.query.sql, event.query.parameters, event.queryDurationMillis);
|
|
47
|
+
}
|
|
48
|
+
function kyselyLogOption() {
|
|
49
|
+
return isInstrumentationEnabled() ? kyselyLog : void 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
export { QUERY_LOG_ENV, QUERY_LOG_PREFIX, SERVER_TIMING_ENV, createRecorder, flushRecorder, formatServerTimingHeader, isInstrumentationEnabled, isServerTimingEnabled, kyselyLogOption, recordEvent };
|
package/dist/db/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "../types-
|
|
2
|
-
import { i as runMigrations, n as getMigrationStatus, r as rollbackMigration, t as MigrationStatus } from "../runner-
|
|
3
|
-
import { a as SqliteConfig, c as sqlite, i as PostgresConfig, n as DatabaseDialectType, o as libsql, r as LibsqlConfig, s as postgres, t as DatabaseDescriptor } from "../adapters-
|
|
1
|
+
import "../types-DOrVigru.mjs";
|
|
2
|
+
import { i as runMigrations, n as getMigrationStatus, r as rollbackMigration, t as MigrationStatus } from "../runner-CFI6B6J2.mjs";
|
|
3
|
+
import { a as SqliteConfig, c as sqlite, i as PostgresConfig, n as DatabaseDialectType, o as libsql, r as LibsqlConfig, s as postgres, t as DatabaseDescriptor } from "../adapters-C2ypTrZZ.mjs";
|
|
4
4
|
export { type DatabaseDescriptor, type DatabaseDialectType, type LibsqlConfig, type MigrationStatus, type PostgresConfig, type SqliteConfig, getMigrationStatus, libsql, postgres, rollbackMigration, runMigrations, sqlite };
|
package/dist/db/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../dialect-helpers-
|
|
2
|
-
import { n as rollbackMigration, r as runMigrations, t as getMigrationStatus } from "../runner-
|
|
1
|
+
import "../dialect-helpers-DhTzaUxP.mjs";
|
|
2
|
+
import { n as rollbackMigration, r as runMigrations, t as getMigrationStatus } from "../runner-DWZm2KQm.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/db/adapters.ts
|
|
5
5
|
/**
|
package/dist/db/libsql.d.mts
CHANGED
package/dist/db/libsql.mjs
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { n as __require } from "../chunk-ClPoSABd.mjs";
|
|
2
|
+
import { SqliteDialect } from "kysely";
|
|
2
3
|
|
|
3
4
|
//#region src/db/libsql.ts
|
|
4
5
|
/**
|
|
6
|
+
* libSQL runtime adapter
|
|
7
|
+
*
|
|
8
|
+
* Creates a Kysely dialect for libSQL/Turso.
|
|
9
|
+
* Falls back to the local SQLite dialect for file-backed URLs so the
|
|
10
|
+
* public `libsql()` adapter can be used in both local development and
|
|
11
|
+
* remote libSQL deployments.
|
|
12
|
+
* Loaded at runtime via virtual module.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
5
15
|
* Create a libSQL dialect from config
|
|
6
16
|
*/
|
|
7
17
|
function createDialect(config) {
|
|
8
|
-
if (config.url === ":memory:" || config.url.startsWith("file:")) {
|
|
9
|
-
const BetterSqlite3 = __require("better-sqlite3");
|
|
10
|
-
const { SqliteDialect } = __require("kysely");
|
|
11
|
-
return new SqliteDialect({ database: new BetterSqlite3(config.url === ":memory:" ? config.url : config.url.slice(5)) });
|
|
12
|
-
}
|
|
18
|
+
if (config.url === ":memory:" || config.url.startsWith("file:")) return new SqliteDialect({ database: new (__require("better-sqlite3"))(config.url === ":memory:" ? config.url : config.url.slice(5)) });
|
|
13
19
|
const { LibsqlDialect } = __require("@libsql/kysely-libsql");
|
|
14
20
|
return new LibsqlDialect({
|
|
15
21
|
url: config.url,
|
package/dist/db/postgres.d.mts
CHANGED
package/dist/db/sqlite.d.mts
CHANGED
package/dist/db/sqlite.mjs
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { n as __require } from "../chunk-ClPoSABd.mjs";
|
|
2
|
+
import { SqliteDialect } from "kysely";
|
|
2
3
|
|
|
3
4
|
//#region src/db/sqlite.ts
|
|
4
5
|
/**
|
|
6
|
+
* SQLite runtime adapter
|
|
7
|
+
*
|
|
8
|
+
* Creates a Kysely dialect for better-sqlite3.
|
|
9
|
+
* Loaded at runtime via virtual module.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
5
12
|
* Create a SQLite dialect from config
|
|
6
13
|
*/
|
|
7
14
|
function createDialect(config) {
|
|
8
15
|
const BetterSqlite3 = __require("better-sqlite3");
|
|
9
|
-
const { SqliteDialect } = __require("kysely");
|
|
10
16
|
const url = config.url;
|
|
11
17
|
return new SqliteDialect({ database: new BetterSqlite3(url.startsWith("file:") ? url.slice(5) : url) });
|
|
12
18
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/utils/db-errors.ts
|
|
2
|
+
/**
|
|
3
|
+
* Shared detection helpers for database-layer error messages.
|
|
4
|
+
*
|
|
5
|
+
* Different SQL dialects phrase "table or relation does not exist" differently.
|
|
6
|
+
* Runtime code that treats pre-migration databases as empty should use this
|
|
7
|
+
* helper rather than duplicating string checks per call-site.
|
|
8
|
+
*/
|
|
9
|
+
function messageOf(error) {
|
|
10
|
+
if (error instanceof Error) return error.message.toLowerCase();
|
|
11
|
+
if (typeof error === "string") return error.toLowerCase();
|
|
12
|
+
return "";
|
|
13
|
+
}
|
|
14
|
+
function isMissingTableError(error) {
|
|
15
|
+
const message = messageOf(error);
|
|
16
|
+
if (!message) return false;
|
|
17
|
+
if (message.includes("no such table")) return true;
|
|
18
|
+
if (message.includes("does not exist") || message.includes("doesn't exist")) return message.includes("relation") || message.includes("table");
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { isMissingTableError as t };
|
|
@@ -9,6 +9,7 @@ const defaultSeed = {
|
|
|
9
9
|
slug: "posts",
|
|
10
10
|
label: "Posts",
|
|
11
11
|
labelSingular: "Post",
|
|
12
|
+
urlPattern: "/posts/{slug}",
|
|
12
13
|
supports: [
|
|
13
14
|
"drafts",
|
|
14
15
|
"revisions",
|
|
@@ -43,6 +44,7 @@ const defaultSeed = {
|
|
|
43
44
|
slug: "pages",
|
|
44
45
|
label: "Pages",
|
|
45
46
|
labelSingular: "Page",
|
|
47
|
+
urlPattern: "/{slug}",
|
|
46
48
|
supports: [
|
|
47
49
|
"drafts",
|
|
48
50
|
"revisions",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { n as validateJsonFieldName, t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
|
|
1
2
|
import { sql } from "kysely";
|
|
2
3
|
|
|
3
4
|
//#region src/database/dialect-helpers.ts
|
|
@@ -81,6 +82,8 @@ function binaryType(db) {
|
|
|
81
82
|
* postgres: column->>'path'
|
|
82
83
|
*/
|
|
83
84
|
function jsonExtractExpr(db, column, path) {
|
|
85
|
+
validateIdentifier(column, "JSON column name");
|
|
86
|
+
validateJsonFieldName(path, "JSON path");
|
|
84
87
|
if (isPostgres(db)) return `${column}->>'${path}'`;
|
|
85
88
|
return `json_extract(${column}, '$.${path}')`;
|
|
86
89
|
}
|
|
@@ -9,11 +9,15 @@ const API_CACHE_HEADERS = { "Cache-Control": "private, no-store" };
|
|
|
9
9
|
/**
|
|
10
10
|
* Create a standardized error response.
|
|
11
11
|
*
|
|
12
|
-
* Always returns `{ error: { code, message } }` with correct Content-Type.
|
|
12
|
+
* Always returns `{ error: { code, message, details? } }` with correct Content-Type.
|
|
13
13
|
* Use this for all error responses in API routes.
|
|
14
14
|
*/
|
|
15
|
-
function apiError(code, message, status) {
|
|
16
|
-
return Response.json({ error: {
|
|
15
|
+
function apiError(code, message, status, details) {
|
|
16
|
+
return Response.json({ error: details ? {
|
|
17
|
+
code,
|
|
18
|
+
message,
|
|
19
|
+
details
|
|
20
|
+
} : {
|
|
17
21
|
code,
|
|
18
22
|
message
|
|
19
23
|
} }, {
|