dineway 0.1.49 → 0.2.1

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.
Files changed (434) hide show
  1. package/dist/activity-DUaz_w7p.mjs +79 -0
  2. package/dist/{activity-events-CwM7yxPW.mjs → activity-events-CJDvE2uc.mjs} +5 -113
  3. package/dist/actor-0QJ1Gbtf.mjs +37 -0
  4. package/dist/after-BfniwgIf.mjs +9 -0
  5. package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins--OwHHiY8.mjs} +1 -1
  6. package/dist/api/route-utils.d.mts +9 -10
  7. package/dist/api/route-utils.mjs +16 -13
  8. package/dist/api/schemas/index.d.mts +2 -2
  9. package/dist/api/schemas/index.mjs +5 -4
  10. package/dist/{api-BMIxRIEN.mjs → api-B4PHIF4V.mjs} +93 -41
  11. package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-tbK_sORH.mjs} +6 -2
  12. package/dist/{apply-D_RlTYtC.mjs → apply-DjTqq6Ae.mjs} +117 -77
  13. package/dist/astro/image-endpoint.d.mts +7 -0
  14. package/dist/astro/image-endpoint.mjs +54 -0
  15. package/dist/astro/index.d.mts +34 -11
  16. package/dist/astro/index.mjs +163 -24
  17. package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
  18. package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
  19. package/dist/astro/middleware/auth.d.mts +8 -18
  20. package/dist/astro/middleware/auth.mjs +42 -24
  21. package/dist/astro/middleware/redirect.mjs +13 -4
  22. package/dist/astro/middleware/request-context.mjs +8 -5
  23. package/dist/astro/middleware/seed.d.mts +1 -1
  24. package/dist/astro/middleware/seed.mjs +2 -2
  25. package/dist/astro/middleware/setup.mjs +1 -1
  26. package/dist/astro/middleware.mjs +389 -206
  27. package/dist/astro/routes/admin.astro +6 -1
  28. package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
  29. package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
  30. package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
  31. package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
  32. package/dist/astro/routes/api/admin/briefing.mjs +21 -17
  33. package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
  34. package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
  35. package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
  36. package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
  37. package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
  38. package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
  39. package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
  40. package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
  41. package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
  42. package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
  43. package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
  44. package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
  45. package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -24
  46. package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -24
  47. package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -28
  48. package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -28
  49. package/dist/astro/routes/api/admin/context/diff.mjs +31 -27
  50. package/dist/astro/routes/api/admin/context/index.mjs +32 -28
  51. package/dist/astro/routes/api/admin/context/stale.mjs +31 -27
  52. package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -24
  53. package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -27
  54. package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -27
  55. package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -25
  56. package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
  57. package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
  58. package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
  59. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -51
  60. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -51
  61. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
  62. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -49
  63. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -48
  64. package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
  65. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
  66. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
  67. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -48
  68. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
  69. package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
  70. package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
  71. package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -63
  72. package/dist/astro/routes/api/admin/review-requests/index.d.mts +2 -1
  73. package/dist/astro/routes/api/admin/review-requests/index.mjs +58 -10
  74. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
  75. package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
  76. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
  77. package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
  78. package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
  79. package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
  80. package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
  81. package/dist/astro/routes/api/admin/users/index.mjs +7 -6
  82. package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
  83. package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
  84. package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
  85. package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
  86. package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
  87. package/dist/astro/routes/api/auth/logout.mjs +2 -2
  88. package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
  89. package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
  90. package/dist/astro/routes/api/auth/me.mjs +9 -8
  91. package/dist/astro/routes/api/auth/mode.mjs +1 -1
  92. package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
  93. package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
  94. package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
  95. package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
  96. package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
  97. package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
  98. package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
  99. package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
  100. package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
  101. package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
  102. package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
  103. package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
  104. package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
  105. package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
  106. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
  107. package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
  108. package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
  109. package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +6 -5
  110. package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
  111. package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -5
  112. package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
  113. package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +49 -20
  114. package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -5
  115. package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
  116. package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +67 -32
  117. package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
  118. package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
  119. package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -5
  120. package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
  121. package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
  122. package/dist/astro/routes/api/content/_collection_/index.mjs +11 -9
  123. package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
  124. package/dist/astro/routes/api/dashboard.mjs +9 -8
  125. package/dist/astro/routes/api/dev/emails.mjs +2 -2
  126. package/dist/astro/routes/api/health.mjs +1 -1
  127. package/dist/astro/routes/api/import/probe.d.mts +3 -3
  128. package/dist/astro/routes/api/import/probe.mjs +22 -10
  129. package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
  130. package/dist/astro/routes/api/import/wordpress/execute.d.mts +18 -1
  131. package/dist/astro/routes/api/import/wordpress/execute.mjs +85 -37
  132. package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -1
  133. package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
  134. package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -32
  135. package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +17 -1
  136. package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +121 -100
  137. package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
  138. package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
  139. package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +55 -2
  140. package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -55
  141. package/dist/astro/routes/api/manifest.mjs +14 -5
  142. package/dist/astro/routes/api/mcp.mjs +753 -170
  143. package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
  144. package/dist/astro/routes/api/media/_id_.mjs +11 -7
  145. package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
  146. package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
  147. package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
  148. package/dist/astro/routes/api/media/providers/index.mjs +2 -2
  149. package/dist/astro/routes/api/media/upload-url.mjs +11 -10
  150. package/dist/astro/routes/api/media.mjs +28 -35
  151. package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -28
  152. package/dist/astro/routes/api/menus/_name_/items.mjs +32 -28
  153. package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -28
  154. package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -28
  155. package/dist/astro/routes/api/menus/_name_.mjs +32 -28
  156. package/dist/astro/routes/api/menus/index.mjs +32 -28
  157. package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
  158. package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
  159. package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
  160. package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
  161. package/dist/astro/routes/api/oauth/register.mjs +4 -4
  162. package/dist/astro/routes/api/oauth/token/refresh.mjs +6 -6
  163. package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
  164. package/dist/astro/routes/api/oauth/token.mjs +6 -6
  165. package/dist/astro/routes/api/openapi.json.mjs +4 -3
  166. package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +46 -31
  167. package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
  168. package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
  169. package/dist/astro/routes/api/redirects/_id_.mjs +33 -29
  170. package/dist/astro/routes/api/redirects/index.mjs +33 -29
  171. package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
  172. package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
  173. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +48 -43
  174. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -43
  175. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -43
  176. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -43
  177. package/dist/astro/routes/api/schema/collections/index.mjs +48 -43
  178. package/dist/astro/routes/api/schema/index.mjs +14 -15
  179. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
  180. package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
  181. package/dist/astro/routes/api/search/enable.mjs +11 -10
  182. package/dist/astro/routes/api/search/index.mjs +10 -9
  183. package/dist/astro/routes/api/search/rebuild.mjs +11 -10
  184. package/dist/astro/routes/api/search/stats.mjs +6 -6
  185. package/dist/astro/routes/api/search/suggest.mjs +10 -9
  186. package/dist/astro/routes/api/sections/_slug_.mjs +32 -28
  187. package/dist/astro/routes/api/sections/index.mjs +32 -28
  188. package/dist/astro/routes/api/settings/email.mjs +4 -4
  189. package/dist/astro/routes/api/settings.mjs +32 -28
  190. package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
  191. package/dist/astro/routes/api/setup/admin.mjs +12 -11
  192. package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
  193. package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
  194. package/dist/astro/routes/api/setup/index.mjs +29 -25
  195. package/dist/astro/routes/api/setup/status.mjs +3 -3
  196. package/dist/astro/routes/api/snapshot.mjs +8 -7
  197. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -31
  198. package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -31
  199. package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -31
  200. package/dist/astro/routes/api/taxonomies/index.mjs +35 -31
  201. package/dist/astro/routes/api/themes/preview.mjs +5 -5
  202. package/dist/astro/routes/api/typegen.mjs +4 -4
  203. package/dist/astro/routes/api/well-known/auth.mjs +3 -3
  204. package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
  205. package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
  206. package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +31 -27
  207. package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -28
  208. package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -28
  209. package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -26
  210. package/dist/astro/routes/api/widget-areas/index.mjs +32 -28
  211. package/dist/astro/routes/api/widget-components.mjs +2 -2
  212. package/dist/astro/routes/robots.txt.mjs +8 -7
  213. package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
  214. package/dist/astro/routes/sitemap.xml.mjs +9 -8
  215. package/dist/astro/session-driver.d.mts +1 -1
  216. package/dist/astro/session-driver.mjs +2 -2
  217. package/dist/astro/types.d.mts +22 -13
  218. package/dist/{audit-BeNsSyfU.mjs → audit-B2pRxZ20.mjs} +1 -1
  219. package/dist/auth/providers/github.d.mts +1 -1
  220. package/dist/auth/providers/google.d.mts +1 -1
  221. package/dist/{auth-control-guard-Dr14I98m.mjs → auth-control-guard-D71jourk.mjs} +1 -1
  222. package/dist/{authorize-BLO0m7fW.mjs → authorize-ZXPGPwKn.mjs} +1 -1
  223. package/dist/{briefing-CkTee1ex.mjs → briefing-0rf-su3-.mjs} +90 -28
  224. package/dist/{briefing-DJX6irto.mjs → briefing-kRhegBoF.mjs} +2 -1
  225. package/dist/bundle-CEcdUa1s.mjs +602 -0
  226. package/dist/{byline-BVC1lV6G.mjs → byline-7xR185Ly.mjs} +30 -62
  227. package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-BKzA0fJU.mjs} +1 -1
  228. package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-Ckeqd1OY.d.mts} +88 -35
  229. package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-WN7RQT4q.mjs} +10 -4
  230. package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-Ba54M74c.mjs} +2 -2
  231. package/dist/{bylines-LN9XISRo.mjs → bylines-C-EL6dh3.mjs} +9 -3
  232. package/dist/{bylines-DwokOFj6.mjs → bylines-CmZFCMr0.mjs} +5 -5
  233. package/dist/{cache-Bac05gBd.mjs → cache-DkVCKGio.mjs} +2 -2
  234. package/dist/{chunks-CuUt7K50.mjs → chunks-ChGNDY8r.mjs} +1 -1
  235. package/dist/cli/index.d.mts +29 -1
  236. package/dist/cli/index.mjs +1466 -1763
  237. package/dist/cli/plugin-kit.d.mts +75 -0
  238. package/dist/cli/plugin-kit.mjs +4 -0
  239. package/dist/client/external-auth-headers.d.mts +1 -1
  240. package/dist/client/index.d.mts +27 -52
  241. package/dist/client/index.mjs +34 -6
  242. package/dist/client-factory-BDD9azPJ.mjs +233 -0
  243. package/dist/{comment-Beue8-15.mjs → comment-DFALgsJD.mjs} +13 -3
  244. package/dist/comment-reaction-C37bf99u.mjs +58 -0
  245. package/dist/{comments-DcjFIfqX.mjs → comments-B3NwDBxl.mjs} +1 -1
  246. package/dist/{content-CBxYGWfL.mjs → content-DJcAYFhz.mjs} +51 -34
  247. package/dist/content-refresh-B4ZCmxgd.mjs +1576 -0
  248. package/dist/{context-Df1xVYyr.mjs → context-DnpXcp6Y.mjs} +2 -2
  249. package/dist/{context-CQVNZaR8.mjs → context-fSCYLL3c.mjs} +125 -53
  250. package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-CI8XzcsK.mjs} +2 -1
  251. package/dist/{cron-DxCAU_Sn.mjs → cron-B1SL_lsb.mjs} +7 -3
  252. package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-D0nj5oWg.mjs} +4 -4
  253. package/dist/db/index.d.mts +3 -3
  254. package/dist/db/index.mjs +1 -1
  255. package/dist/db/libsql.d.mts +1 -1
  256. package/dist/db/postgres.d.mts +1 -1
  257. package/dist/db/sqlite.d.mts +1 -1
  258. package/dist/{device-flow-BZVGftqi.mjs → device-flow-BJe6VEhP.mjs} +5 -5
  259. package/dist/{placeholder-d54Qr_7n.mjs → enrich-Ck9tfMqe.mjs} +36 -9
  260. package/dist/{error-DCSuUAZW.mjs → error-CSVaQNZy.mjs} +5 -0
  261. package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-GVhUgzEs.mjs} +1 -1
  262. package/dist/field-defs-cache-DL-T2XVS.mjs +49 -0
  263. package/dist/forgeway-seo-client-G5ddhVHd.mjs +456 -0
  264. package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-ewTGohf4.mjs} +1 -1
  265. package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-DEFj8e6u.mjs} +2 -2
  266. package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-C23JHaWz.mjs} +5 -4
  267. package/dist/import-CXXL5pip.mjs +1354 -0
  268. package/dist/index-DcnOCD1e.d.mts +375 -0
  269. package/dist/index.d.mts +15 -16
  270. package/dist/index.mjs +85 -70
  271. package/dist/{jsonld-DZ67souc.d.mts → jsonld-DzKbhRZ4.d.mts} +8 -4
  272. package/dist/{load-D9OiGr2m.mjs → load-CFtJRT3c.mjs} +1 -1
  273. package/dist/{loader--GOYux8M.mjs → loader-aWkkc1_o.mjs} +117 -31
  274. package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-uA6pRFXi.mjs} +38 -1
  275. package/dist/mcp-reviewed-executor-Dn52L_yY.mjs +558 -0
  276. package/dist/media/image-endpoint.d.mts +32 -0
  277. package/dist/media/image-endpoint.mjs +111 -0
  278. package/dist/media/index.d.mts +27 -2
  279. package/dist/media/index.mjs +5 -3
  280. package/dist/media/local-runtime.d.mts +15 -11
  281. package/dist/media/local-runtime.mjs +9 -7
  282. package/dist/{media-CbKyYukG.mjs → media-CVMOoywq.mjs} +3 -1
  283. package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-zDNJmXCo.mjs} +1 -1
  284. package/dist/media-url-BdoLPvg8.mjs +20 -0
  285. package/dist/{menus-C7F0sCrC.mjs → menus-CCG2z5um.mjs} +80 -15
  286. package/dist/{menus-BZbXf-ej.mjs → menus-CmyIkRG5.mjs} +19 -5
  287. package/dist/{normalize-ByemhhfW.mjs → normalize-Cyt7JdF7.mjs} +8 -1
  288. package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-B9H7X85L.mjs} +5 -5
  289. package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dwl32-Uj.mjs} +2 -2
  290. package/dist/object-cache/memory.d.mts +14 -0
  291. package/dist/object-cache/memory.mjs +55 -0
  292. package/dist/object-cache-D51qOseS.mjs +419 -0
  293. package/dist/output-DhBe5_Pi.mjs +68 -0
  294. package/dist/page/index.d.mts +10 -3
  295. package/dist/page/index.mjs +2 -2
  296. package/dist/{parse-CneSgl7-.mjs → parse-i15EFSAE.mjs} +1 -1
  297. package/dist/{parser-DxfsARXL.mjs → parser-06LLLL4E.mjs} +151 -9
  298. package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-DkWkXfDI.d.mts} +12 -4
  299. package/dist/plugin-utils.d.mts +8 -9
  300. package/dist/plugins/adapt-sandbox-entry.d.mts +8 -9
  301. package/dist/plugins/adapt-sandbox-entry.mjs +13 -2
  302. package/dist/{plugins-DzfqRREq.mjs → plugins-CPA2PtfY.mjs} +919 -66
  303. package/dist/{transport-LSdZVXHF.mjs → portable-text-BASHceim.mjs} +1 -134
  304. package/dist/portable-text-E79LyjGo.d.mts +45 -0
  305. package/dist/{preview-C-3YTX2U.mjs → preview-BjedZm8G.mjs} +4 -3
  306. package/dist/process-cache-CCDgti7j.mjs +106 -0
  307. package/dist/project-env-DKibmuP8.mjs +95 -0
  308. package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-DC2JdWeO.d.mts} +1 -1
  309. package/dist/{public-url-B4xV4rGa.d.mts → public-url-DQJCnYi9.d.mts} +1 -1
  310. package/dist/publication-authorization-RKiHXKtq.mjs +985 -0
  311. package/dist/{query-CZ3TH_Uu.mjs → query-C2U5u5_p.mjs} +11 -6
  312. package/dist/{query-Ds0EnMFX.mjs → query-DEv5x6yB.mjs} +281 -76
  313. package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-DglsAJSw.mjs} +2 -2
  314. package/dist/{redirect-CEACczxo.mjs → redirect-ubhEqQCQ.mjs} +2 -2
  315. package/dist/{redirects-ocRJmQHP.mjs → redirects-Bhpm8bRe.mjs} +35 -19
  316. package/dist/{redirects-DYj1yPxs.mjs → redirects-xs2yahLq.mjs} +47 -24
  317. package/dist/{registry-D7HACema.mjs → registry-BYYyb2tF.mjs} +148 -81
  318. package/dist/request-context.d.mts +2 -0
  319. package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CFe1tW2M.mjs} +1 -1
  320. package/dist/review-payload-BysRWpxS.mjs +111 -0
  321. package/dist/{review-requests-BW2NxY-l.mjs → review-requests-CTWGnWUt.mjs} +1 -1
  322. package/dist/review-requests-D42VEP1l.mjs +142 -0
  323. package/dist/review-route-helpers-C31vO6SI.mjs +41 -0
  324. package/dist/runner-BgmttQmD.mjs +7444 -0
  325. package/dist/{runner-09sTqtv0.d.mts → runner-D6hzs8L9.d.mts} +1 -1
  326. package/dist/runtime.d.mts +9 -10
  327. package/dist/runtime.mjs +3 -3
  328. package/dist/schema-DUtnZxjZ.mjs +8 -0
  329. package/dist/{search-Gdrqj582.mjs → search-DUKgZUlm.mjs} +5 -3
  330. package/dist/{secrets-CeGpBFV2.mjs → secrets-ZV5rd8yV.mjs} +14 -11
  331. package/dist/{sections-BOjU13Y-.mjs → sections-DvFgsnda.mjs} +2 -2
  332. package/dist/seed/index.d.mts +2 -2
  333. package/dist/seed/index.mjs +21 -18
  334. package/dist/seo/index.d.mts +1 -1
  335. package/dist/seo/index.mjs +3 -12
  336. package/dist/{seo-5lJOtB5J.mjs → seo-BLszyJxd.mjs} +22 -4
  337. package/dist/{seo-CLj8lS7Q.mjs → seo-BU8MLCS9.mjs} +5 -2
  338. package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-GnCuL1ML.mjs} +11 -3
  339. package/dist/{service-jGlhrICs.mjs → service-FL3fB0Rx.mjs} +2 -2
  340. package/dist/session-user-Ct6GBLvn.mjs +22 -0
  341. package/dist/{settings-CUXOxzsT.mjs → settings-BECcAIRH.mjs} +28 -55
  342. package/dist/{settings-DlBsT2VS.mjs → settings-EzADu-dd.mjs} +2 -2
  343. package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-Da0axZEE.mjs} +1 -1
  344. package/dist/{site-activity-DONFrMBJ.mjs → site-activity-h8smOlYI.mjs} +1 -1
  345. package/dist/{site-context-C8Az_P_I.mjs → site-context-B8T1kpUP.mjs} +337 -530
  346. package/dist/{site-url-DIMD68go.mjs → site-url-DJEid0ml.mjs} +1 -1
  347. package/dist/stable-hash-DshcXvRE.mjs +19 -0
  348. package/dist/status-NqWOSFAD.mjs +21 -0
  349. package/dist/storage/local.d.mts +1 -1
  350. package/dist/storage/local.mjs +1 -1
  351. package/dist/storage/s3.d.mts +1 -1
  352. package/dist/storage/s3.mjs +1 -1
  353. package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-BiM9NtgW.mjs} +36 -29
  354. package/dist/taxonomies-DSnY5nOa.mjs +443 -0
  355. package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-0k_vRVsD.mjs} +44 -9
  356. package/dist/transport-C46KHLMP.mjs +134 -0
  357. package/dist/types-A8fPOJnl.mjs +69 -0
  358. package/dist/types-BLQCz46p.d.mts +118 -0
  359. package/dist/{types-CwawBUTa.d.mts → types-B_FlxIIl.d.mts} +4 -1
  360. package/dist/{types-CSgR9nQB.mjs → types-ChxYDRvx.mjs} +1 -1
  361. package/dist/{types-GaCtZ1k9.d.mts → types-Cw0PeCT_.d.mts} +18 -0
  362. package/dist/types-DuQn1G7-.d.mts +2973 -0
  363. package/dist/{runtime-C4-2lSFg.d.mts → types-DwoUifGE.d.mts} +5668 -3000
  364. package/dist/{types-DRIKLmJI.d.mts → types-opjX_kz6.d.mts} +17 -2
  365. package/dist/ui/server-runtime.d.mts +13 -15
  366. package/dist/ui/server-runtime.mjs +24 -20
  367. package/dist/url-guoXQQcV.mjs +33 -0
  368. package/dist/{user-DTLoZs16.mjs → user-BH-n01y3.mjs} +2 -2
  369. package/dist/{utils-B8hBJ9Oz.mjs → utils-D1SrKGtP.mjs} +129 -7
  370. package/dist/{validate-DzjCdy6v.d.mts → validate-CbVFoJgc.d.mts} +65 -8
  371. package/dist/{validate-DWmPO6oj.mjs → validate-D1HL-oLR.mjs} +11 -6
  372. package/dist/version-C3iVRuaF.mjs +6 -0
  373. package/dist/{widgets-BpJ8EpPd.mjs → widgets-BZrLrNgS.mjs} +46 -43
  374. package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-C3PWcowq.mjs} +1 -1
  375. package/dist/{zod-generator-K91-g665.mjs → zod-generator-C7AsLpSB.mjs} +42 -14
  376. package/package.json +38 -8
  377. package/src/components/Block.astro +50 -0
  378. package/src/components/Comments.astro +143 -1
  379. package/src/components/DinewayHead.astro +19 -2
  380. package/src/components/DinewayImage.astro +66 -33
  381. package/src/components/DinewayMedia.astro +1 -2
  382. package/src/components/Image.astro +85 -40
  383. package/src/components/InlinePortableTextEditor.tsx +12 -2
  384. package/src/components/JsonLdScript.astro +9 -0
  385. package/src/components/LiveSearch.astro +40 -4
  386. package/src/components/index.ts +4 -0
  387. package/src/components/live-search-routing.ts +30 -0
  388. package/src/components/portable-text-text-align.ts +15 -0
  389. package/src/ui.ts +2 -0
  390. package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
  391. package/dist/import-4YBXbDkI.mjs +0 -684
  392. package/dist/index-CZiWCQDp.d.mts +0 -227
  393. package/dist/review-requests-Qum4713s.mjs +0 -79
  394. package/dist/runner-DzIpHGND.mjs +0 -2836
  395. package/dist/schema-Bsi-VpYv.mjs +0 -8
  396. package/dist/taxonomies-CZ-_DitR.mjs +0 -327
  397. package/dist/types-CuJOqHfM.d.mts +0 -758
  398. package/dist/types-DSPGWjxO.d.mts +0 -1247
  399. package/dist/types-nP9vGUFq.d.mts +0 -56
  400. package/dist/version-C4gfn0PJ.mjs +0 -6
  401. /package/dist/{adapters-OQCImOL7.d.mts → adapters-BiRymx02.d.mts} +0 -0
  402. /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-Ypaly90d.mjs} +0 -0
  403. /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-D5pSY2S1.mjs} +0 -0
  404. /package/dist/{components--pg6zBvu.mjs → components-DImzlLhb.mjs} +0 -0
  405. /package/dist/{context-types-r8oFvyOq.mjs → context-types-eBuMDAg-.mjs} +0 -0
  406. /package/dist/{default-B6iaLvP7.mjs → default-D4Vygcy_.mjs} +0 -0
  407. /package/dist/{email-console-BOVqIYpB.mjs → email-console-Bp0r68iF.mjs} +0 -0
  408. /package/dist/{escape-BDgouFFY.mjs → escape-DN4Qmjsl.mjs} +0 -0
  409. /package/dist/{hash-BPmX6P8I.mjs → hash-mxxx2oPW.mjs} +0 -0
  410. /package/dist/{mime-CbKsKDCB.mjs → mime-C0vOHFm7.mjs} +0 -0
  411. /package/dist/{mode-CZqCF9dZ.mjs → mode-C8yZnIlR.mjs} +0 -0
  412. /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CndT35iw.mjs} +0 -0
  413. /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-CMehAaKs.mjs} +0 -0
  414. /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
  415. /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-NYukYGed.mjs} +0 -0
  416. /package/dist/{patterns-DKAX6oqN.mjs → patterns-CoqlXUvk.mjs} +0 -0
  417. /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-BtfrrzfD.mjs} +0 -0
  418. /package/dist/{public-url-B_m9IwdV.mjs → public-url-Cp6hyjVR.mjs} +0 -0
  419. /package/dist/{redirect-BjIBtDWY.mjs → redirect-DrbEmU9a.mjs} +0 -0
  420. /package/dist/{request-cache-ho99schz.mjs → request-cache-CBFjCwSt.mjs} +0 -0
  421. /package/dist/{resolve-DTuDyYKs.mjs → resolve-DE71WcL9.mjs} +0 -0
  422. /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-BtkKnvxQ.mjs} +0 -0
  423. /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-Ctzfyyp-.mjs} +0 -0
  424. /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
  425. /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-FJqwQzj4.mjs} +0 -0
  426. /package/dist/{tokens-SLmgowfd.mjs → tokens-BDQU29Vd.mjs} +0 -0
  427. /package/dist/{transaction-CFLhEOuH.mjs → transaction-0LEAAy8R.mjs} +0 -0
  428. /package/dist/{transport-BnsNxh2l.d.mts → transport-D9pKAzFP.d.mts} +0 -0
  429. /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-Dm7Mxvt6.mjs} +0 -0
  430. /package/dist/{types-CJ8DkL0q.mjs → types-B7TDDFMG.mjs} +0 -0
  431. /package/dist/{types-Dryvv7LH.d.mts → types-g0zMtraY.d.mts} +0 -0
  432. /package/dist/{types-Cg276-3z.mjs → types-mVVgRPaU.mjs} +0 -0
  433. /package/dist/{types-DZpT-PnG.d.mts → types-wFu80FrO.d.mts} +0 -0
  434. /package/dist/{url-w7Mp5qAD.mjs → url-EMAguGVk.mjs} +0 -0
@@ -1,12 +1,13 @@
1
- import { a as __exportAll } from "./runner-DzIpHGND.mjs";
2
- import { n as hashString } from "./hash-BPmX6P8I.mjs";
1
+ import { a as __exportAll } from "./runner-BgmttQmD.mjs";
2
+ import { n as hashString } from "./hash-mxxx2oPW.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/schema/zod-generator.ts
6
6
  var zod_generator_exports = /* @__PURE__ */ __exportAll({
7
7
  generateSchemaHash: () => generateSchemaHash,
8
8
  generateTypeScript: () => generateTypeScript,
9
- generateTypesFile: () => generateTypesFile
9
+ generateTypesFile: () => generateTypesFile,
10
+ uniqueInterfaceNames: () => uniqueInterfaceNames
10
11
  });
11
12
  /** Pattern to split on underscores, hyphens, and spaces for PascalCase conversion */
12
13
  const PASCAL_CASE_SPLIT_PATTERN = /[_\-\s]+/;
@@ -14,8 +15,7 @@ const PASCAL_CASE_SPLIT_PATTERN = /[_\-\s]+/;
14
15
  * Generate TypeScript interface from field definitions
15
16
  * Used by CLI `dineway types` to generate types
16
17
  */
17
- function generateTypeScript(collection) {
18
- const interfaceName = getInterfaceName(collection);
18
+ function generateTypeScript(collection, interfaceName = getInterfaceName(collection)) {
19
19
  const lines = [];
20
20
  lines.push(`export interface ${interfaceName} {`);
21
21
  lines.push(` id: string;`);
@@ -50,16 +50,14 @@ function generateTypesFile(collections) {
50
50
  if (needsPortableText) imports.push("PortableTextBlock");
51
51
  lines.push(`import type { ${imports.join(", ")} } from "dineway";`);
52
52
  lines.push(``);
53
+ const interfaceNames = uniqueInterfaceNames(collections);
53
54
  for (const collection of collections) {
54
- lines.push(generateTypeScript(collection));
55
+ lines.push(generateTypeScript(collection, interfaceNames.get(collection.slug)));
55
56
  lines.push(``);
56
57
  }
57
58
  lines.push(`declare module "dineway" {`);
58
59
  lines.push(` interface DinewayCollections {`);
59
- for (const collection of collections) {
60
- const interfaceName = getInterfaceName(collection);
61
- lines.push(` ${collection.slug}: ${interfaceName};`);
62
- }
60
+ for (const collection of collections) lines.push(` ${collection.slug}: ${interfaceNames.get(collection.slug)};`);
63
61
  lines.push(` }`);
64
62
  lines.push(`}`);
65
63
  return lines.join("\n");
@@ -114,7 +112,8 @@ function pascalCase(str) {
114
112
  return str.split(PASCAL_CASE_SPLIT_PATTERN).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join("");
115
113
  }
116
114
  /**
117
- * Simple singularization - handles common cases
115
+ * Naive singularization for slug-derived interface names. Handles common
116
+ * English plural endings; intentionally simple, not a full inflector.
118
117
  */
119
118
  function singularize(str) {
120
119
  if (str.endsWith("ies")) return str.slice(0, -3) + "y";
@@ -123,11 +122,40 @@ function singularize(str) {
123
122
  return str;
124
123
  }
125
124
  /**
126
- * Get the interface name for a collection
125
+ * Get the interface name for a collection.
126
+ *
127
+ * Derived from the slug, not the human label. Slugs are constrained to
128
+ * /^[a-z][a-z0-9_]*$/, so PascalCasing one always yields a valid TypeScript
129
+ * identifier. Labels are arbitrary user-facing text and may contain spaces,
130
+ * punctuation, or duplicates across collections.
131
+ *
132
+ * The slug is singularized first because the interface describes one entry,
133
+ * not the collection. Callers emitting more than one interface should use
134
+ * uniqueInterfaceNames() to resolve collisions introduced by singularization.
127
135
  */
128
136
  function getInterfaceName(collection) {
129
- return pascalCase(collection.labelSingular || singularize(collection.slug));
137
+ return pascalCase(singularize(collection.slug));
138
+ }
139
+ /**
140
+ * Resolve interface names for a set of collections, guaranteeing each emitted
141
+ * identifier is unique within the generated file.
142
+ */
143
+ function uniqueInterfaceNames(collections) {
144
+ const used = /* @__PURE__ */ new Set();
145
+ const names = /* @__PURE__ */ new Map();
146
+ for (const collection of collections) {
147
+ const base = getInterfaceName(collection);
148
+ let name = base;
149
+ let suffix = 2;
150
+ while (used.has(name)) {
151
+ name = `${base}${suffix}`;
152
+ suffix++;
153
+ }
154
+ used.add(name);
155
+ names.set(collection.slug, name);
156
+ }
157
+ return names;
130
158
  }
131
159
 
132
160
  //#endregion
133
- export { zod_generator_exports as n, generateTypeScript as t };
161
+ export { uniqueInterfaceNames as n, zod_generator_exports as r, generateTypeScript as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dineway",
3
- "version": "0.1.49",
3
+ "version": "0.2.1",
4
4
  "description": "Agentic Website builder for restaurants — structured content meets AI via the Model Context Protocol",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -64,6 +64,10 @@
64
64
  "types": "./dist/cli/index.d.mts",
65
65
  "default": "./dist/cli/index.mjs"
66
66
  },
67
+ "./cli/plugin-kit": {
68
+ "types": "./dist/cli/plugin-kit.d.mts",
69
+ "default": "./dist/cli/plugin-kit.mjs"
70
+ },
67
71
  "./routes/PluginRegistry": {
68
72
  "types": "./dist/astro/routes/PluginRegistry.d.mts",
69
73
  "default": "./dist/astro/routes/PluginRegistry.mjs"
@@ -93,6 +97,10 @@
93
97
  "types": "./dist/storage/s3.d.mts",
94
98
  "default": "./dist/storage/s3.mjs"
95
99
  },
100
+ "./object-cache/memory": {
101
+ "types": "./dist/object-cache/memory.d.mts",
102
+ "default": "./dist/object-cache/memory.mjs"
103
+ },
96
104
  "./media": {
97
105
  "types": "./dist/media/index.d.mts",
98
106
  "default": "./dist/media/index.mjs"
@@ -101,6 +109,14 @@
101
109
  "types": "./dist/media/local-runtime.d.mts",
102
110
  "default": "./dist/media/local-runtime.mjs"
103
111
  },
112
+ "./media/image-endpoint": {
113
+ "types": "./dist/media/image-endpoint.d.mts",
114
+ "default": "./dist/media/image-endpoint.mjs"
115
+ },
116
+ "./image-endpoint": {
117
+ "types": "./dist/astro/image-endpoint.d.mts",
118
+ "default": "./dist/astro/image-endpoint.mjs"
119
+ },
104
120
  "./runtime": {
105
121
  "types": "./dist/runtime.d.mts",
106
122
  "default": "./dist/runtime.mjs"
@@ -217,6 +233,9 @@
217
233
  "cli": [
218
234
  "dist/cli/index.d.mts"
219
235
  ],
236
+ "cli/plugin-kit": [
237
+ "dist/cli/plugin-kit.d.mts"
238
+ ],
220
239
  "client": [
221
240
  "dist/client/index.d.mts"
222
241
  ],
@@ -265,6 +284,12 @@
265
284
  "media/local-runtime": [
266
285
  "dist/media/local-runtime.d.mts"
267
286
  ],
287
+ "media/image-endpoint": [
288
+ "dist/media/image-endpoint.d.mts"
289
+ ],
290
+ "image-endpoint": [
291
+ "dist/astro/image-endpoint.d.mts"
292
+ ],
268
293
  "middleware": [
269
294
  "dist/astro/middleware.d.mts"
270
295
  ],
@@ -280,6 +305,9 @@
280
305
  "middleware/setup": [
281
306
  "dist/astro/middleware/setup.d.mts"
282
307
  ],
308
+ "object-cache/memory": [
309
+ "dist/object-cache/memory.d.mts"
310
+ ],
283
311
  "page": [
284
312
  "dist/page/index.d.mts"
285
313
  ],
@@ -320,7 +348,7 @@
320
348
  },
321
349
  "dependencies": {
322
350
  "@forgeway/sdk": "^1.1.0",
323
- "@cloudflare/kumo": "^2.3.0",
351
+ "@cloudflare/kumo": "2.6.0",
324
352
  "@floating-ui/react": "^0.27.16",
325
353
  "@modelcontextprotocol/sdk": "^1.26.0",
326
354
  "@portabletext/toolkit": "^5.0.1",
@@ -338,7 +366,7 @@
338
366
  "@tiptap/suggestion": "^3.20.0",
339
367
  "@unpic/placeholder": "^0.1.2",
340
368
  "arctic": "^3.7.0",
341
- "astro-portabletext": "^0.11.0",
369
+ "astro-portabletext": "^0.13.0",
342
370
  "better-sqlite3": "^12.8.0",
343
371
  "blurhash": "^2.0.5",
344
372
  "citty": "^0.1.6",
@@ -350,15 +378,16 @@
350
378
  "kysely": "^0.27.0",
351
379
  "mime": "^4.1.0",
352
380
  "modern-tar": "^0.7.5",
381
+ "parse5": "^8.0.0",
353
382
  "picocolors": "^1.1.1",
354
383
  "sanitize-html": "^2.17.1",
355
384
  "sax": "^1.4.1",
356
385
  "ulidx": "^2.4.1",
357
386
  "upng-js": "^2.1.0",
358
387
  "zod": "^4.4.1",
359
- "@dineway-ai/admin": "^0.1.18",
360
- "@dineway-ai/auth": "^0.1.18",
361
- "@dineway-ai/gutenberg-to-portable-text": "^0.1.16"
388
+ "@dineway-ai/admin": "^0.2.1",
389
+ "@dineway-ai/auth": "^0.2.3",
390
+ "@dineway-ai/gutenberg-to-portable-text": "^0.2.1"
362
391
  },
363
392
  "optionalDependencies": {
364
393
  "@aws-sdk/client-s3": "^3.1049.0",
@@ -380,14 +409,14 @@
380
409
  "@types/react": "19.2.14",
381
410
  "@types/sanitize-html": "^2.16.0",
382
411
  "@types/sax": "^1.2.7",
383
- "@vitest/ui": "^4.0.17",
412
+ "@vitest/ui": "4.0.18",
384
413
  "publint": "0.3.17",
385
414
  "tsdown": "0.20.3",
386
415
  "typescript": "^5.9.3",
387
416
  "vite": "^6.0.0",
388
417
  "vitest": "^4.0.18",
389
418
  "zod-openapi": "^5.4.6",
390
- "@dineway-ai/blocks": "^0.1.16"
419
+ "@dineway-ai/blocks": "^0.2.3"
391
420
  },
392
421
  "keywords": [
393
422
  "astro",
@@ -405,6 +434,7 @@
405
434
  "typecheck": "tsgo --noEmit",
406
435
  "check": "publint && attw --pack --ignore-rules=cjs-resolves-to-esm --ignore-rules=no-resolution --ignore-rules=internal-resolution-error",
407
436
  "test": "vitest",
437
+ "test:repro": "vitest run --config vitest.repro.config.ts",
408
438
  "test:smoke": "vitest run --config vitest.smoke.config.ts",
409
439
  "test:integration": "vitest run --config vitest.integration.config.ts"
410
440
  }
@@ -0,0 +1,50 @@
1
+ ---
2
+ import type { BlockProps } from "astro-portabletext/types";
3
+
4
+ import { textAlignClassName } from "./portable-text-text-align.js";
5
+
6
+ type TextAlignedNode = BlockProps["node"] & { textAlign?: string };
7
+ type Props = Omit<BlockProps, "node"> & { node: TextAlignedNode };
8
+
9
+ const props = Astro.props as Props;
10
+ const { node, index: _index, isInline: _isInline, ...attrs } = props;
11
+
12
+ const styleIs = (style: string) => style === node.style;
13
+ const alignClass = textAlignClassName(node.textAlign);
14
+ ---
15
+
16
+ {
17
+ styleIs("h1") ? (
18
+ <h1 class={alignClass} {...attrs}>
19
+ <slot />
20
+ </h1>
21
+ ) : styleIs("h2") ? (
22
+ <h2 class={alignClass} {...attrs}>
23
+ <slot />
24
+ </h2>
25
+ ) : styleIs("h3") ? (
26
+ <h3 class={alignClass} {...attrs}>
27
+ <slot />
28
+ </h3>
29
+ ) : styleIs("h4") ? (
30
+ <h4 class={alignClass} {...attrs}>
31
+ <slot />
32
+ </h4>
33
+ ) : styleIs("h5") ? (
34
+ <h5 class={alignClass} {...attrs}>
35
+ <slot />
36
+ </h5>
37
+ ) : styleIs("h6") ? (
38
+ <h6 class={alignClass} {...attrs}>
39
+ <slot />
40
+ </h6>
41
+ ) : styleIs("blockquote") ? (
42
+ <blockquote class={alignClass} {...attrs}>
43
+ <slot />
44
+ </blockquote>
45
+ ) : (
46
+ <p class={alignClass} {...attrs}>
47
+ <slot />
48
+ </p>
49
+ )
50
+ }
@@ -19,6 +19,8 @@ interface Props {
19
19
  collection: string;
20
20
  contentId: string;
21
21
  threaded?: boolean;
22
+ reactions?: boolean;
23
+ sort?: "oldest" | "best";
22
24
  class?: string;
23
25
  }
24
26
 
@@ -26,13 +28,15 @@ const {
26
28
  collection,
27
29
  contentId,
28
30
  threaded = false,
31
+ reactions = false,
32
+ sort = "oldest",
29
33
  class: className,
30
34
  } = Astro.props;
31
35
 
32
36
  const collectionInfo = await getCollectionInfo(collection);
33
37
  const enabled = collectionInfo?.commentsEnabled ?? false;
34
38
  const { items, total } = enabled
35
- ? await getComments({ collection, contentId, threaded })
39
+ ? await getComments({ collection, contentId, threaded, reactions, sort })
36
40
  : { items: [], total: 0 };
37
41
 
38
42
  const URL_RE = /https?:\/\/[^\s<>"')\]]+/g;
@@ -60,15 +64,74 @@ function escapeHtml(text: string): string {
60
64
  function formatBody(text: string): string {
61
65
  return autoLinkUrls(escapeHtml(text));
62
66
  }
67
+
68
+ const REACTION_SCRIPT = `
69
+ (() => {
70
+ const sections = document.querySelectorAll('[data-ec-comments][data-ec-reactions]');
71
+ sections.forEach((section) => {
72
+ const collection = section.getAttribute('data-collection');
73
+ const contentId = section.getAttribute('data-content-id');
74
+ if (!collection || !contentId) return;
75
+
76
+ const base = '/_dineway/api/comments/' + encodeURIComponent(collection) + '/' + encodeURIComponent(contentId) + '/reactions';
77
+ const headers = { 'X-Dineway-Request': '1' };
78
+
79
+ fetch(base, { headers: headers })
80
+ .then((response) => (response.ok ? response.json() : null))
81
+ .then((payload) => {
82
+ const viewer = payload && payload.data && payload.data.viewer;
83
+ if (!viewer) return;
84
+ Object.keys(viewer).forEach((commentId) => {
85
+ (viewer[commentId] || []).forEach((reaction) => {
86
+ const selector = '.ec-reaction[data-comment-id="' + commentId + '"][data-ec-reaction="' + reaction + '"]';
87
+ const button = section.querySelector(selector);
88
+ if (button) button.setAttribute('aria-pressed', 'true');
89
+ });
90
+ });
91
+ })
92
+ .catch(() => {});
93
+
94
+ section.addEventListener('click', (event) => {
95
+ const target = event.target;
96
+ if (!(target instanceof Element)) return;
97
+ const button = target.closest('.ec-reaction');
98
+ if (!button || !section.contains(button)) return;
99
+
100
+ const commentId = button.getAttribute('data-comment-id');
101
+ const reaction = button.getAttribute('data-ec-reaction');
102
+ if (!commentId || !reaction) return;
103
+
104
+ button.disabled = true;
105
+ fetch(base, {
106
+ method: 'POST',
107
+ headers: Object.assign({ 'Content-Type': 'application/json' }, headers),
108
+ body: JSON.stringify({ commentId: commentId, reaction: reaction }),
109
+ })
110
+ .then((response) => (response.ok ? response.json() : null))
111
+ .then((payload) => {
112
+ const data = payload && payload.data;
113
+ if (!data) return;
114
+ button.setAttribute('aria-pressed', data.reacted ? 'true' : 'false');
115
+ const countEl = button.querySelector('[data-ec-reaction-count]');
116
+ if (countEl) countEl.textContent = String((data.counts && data.counts[reaction]) || 0);
117
+ })
118
+ .catch(() => {})
119
+ .finally(() => { button.disabled = false; });
120
+ });
121
+ });
122
+ })();
123
+ `;
63
124
  ---
64
125
 
65
126
  {
66
127
  enabled && (
128
+ <Fragment>
67
129
  <section
68
130
  class:list={["ec-comments", className]}
69
131
  data-ec-comments
70
132
  data-collection={collection}
71
133
  data-content-id={contentId}
134
+ {...(reactions ? { "data-ec-reactions": "" } : {})}
72
135
  >
73
136
  <h3 class="ec-comments-heading">
74
137
  {total === 0
@@ -110,6 +173,25 @@ function formatBody(text: string): string {
110
173
  class="ec-comment-body"
111
174
  set:html={formatBody(comment.body)}
112
175
  />
176
+ {reactions && (
177
+ <div class="ec-comment-actions">
178
+ <button
179
+ type="button"
180
+ class="ec-reaction"
181
+ data-ec-reaction="like"
182
+ data-comment-id={comment.id}
183
+ aria-pressed="false"
184
+ >
185
+ <span class="ec-reaction-icon" aria-hidden="true">
186
+ &#x2661;
187
+ </span>
188
+ <span class="ec-reaction-label">Like</span>
189
+ <span class="ec-reaction-count" data-ec-reaction-count>
190
+ {comment.reactions?.like ?? 0}
191
+ </span>
192
+ </button>
193
+ </div>
194
+ )}
113
195
  {threaded && comment.replies && comment.replies.length > 0 && (
114
196
  <ol class="ec-comment-replies">
115
197
  {comment.replies.map((reply: PublicComment) => (
@@ -151,6 +233,28 @@ function formatBody(text: string): string {
151
233
  class="ec-comment-body"
152
234
  set:html={formatBody(reply.body)}
153
235
  />
236
+ {reactions && (
237
+ <div class="ec-comment-actions">
238
+ <button
239
+ type="button"
240
+ class="ec-reaction"
241
+ data-ec-reaction="like"
242
+ data-comment-id={reply.id}
243
+ aria-pressed="false"
244
+ >
245
+ <span class="ec-reaction-icon" aria-hidden="true">
246
+ &#x2661;
247
+ </span>
248
+ <span class="ec-reaction-label">Like</span>
249
+ <span
250
+ class="ec-reaction-count"
251
+ data-ec-reaction-count
252
+ >
253
+ {reply.reactions?.like ?? 0}
254
+ </span>
255
+ </button>
256
+ </div>
257
+ )}
154
258
  </article>
155
259
  </li>
156
260
  ))}
@@ -162,6 +266,8 @@ function formatBody(text: string): string {
162
266
  </ol>
163
267
  )}
164
268
  </section>
269
+ {reactions && <script is:inline set:html={REACTION_SCRIPT} />}
270
+ </Fragment>
165
271
  )
166
272
  }
167
273
 
@@ -227,4 +333,40 @@ function formatBody(text: string): string {
227
333
  white-space: pre-wrap;
228
334
  word-break: break-word;
229
335
  }
336
+
337
+ .ec-comment-actions {
338
+ margin-top: 0.5rem;
339
+ }
340
+
341
+ .ec-reaction {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ gap: 0.35rem;
345
+ font: inherit;
346
+ font-size: 0.875em;
347
+ color: inherit;
348
+ background: none;
349
+ border: var(--ec-comment-border);
350
+ border-radius: 999px;
351
+ padding: 0.15rem 0.6rem;
352
+ cursor: pointer;
353
+ }
354
+
355
+ .ec-reaction[aria-pressed="true"] {
356
+ border-color: currentColor;
357
+ font-weight: 600;
358
+ }
359
+
360
+ .ec-reaction[aria-pressed="true"] .ec-reaction-icon {
361
+ color: #e0245e;
362
+ }
363
+
364
+ .ec-reaction:disabled {
365
+ opacity: 0.5;
366
+ cursor: default;
367
+ }
368
+
369
+ .ec-reaction-count {
370
+ font-variant-numeric: tabular-nums;
371
+ }
230
372
  </style>
@@ -14,6 +14,7 @@
14
14
  * ```
15
15
  */
16
16
  import {
17
+ createSha256CspHash,
17
18
  generateBaseSeoContributions,
18
19
  generateSiteSeoContributions,
19
20
  getPageRuntime,
@@ -25,7 +26,9 @@ import {
25
26
  absolutizeMediaUrl,
26
27
  type PageMetadataContribution,
27
28
  type PublicPageContext,
29
+ type ResolvedPageMetadata,
28
30
  } from "dineway/ui/server-runtime";
31
+ import JsonLdScript from "./JsonLdScript.astro";
29
32
 
30
33
  interface Props {
31
34
  page: PublicPageContext;
@@ -37,6 +40,7 @@ const runtime = getPageRuntime(Astro.locals as Record<string, unknown>);
37
40
  let metadataHtml = "";
38
41
  let siteIdentityHtml = "";
39
42
  let fragmentsHtml = "";
43
+ let jsonLdScripts: ResolvedPageMetadata["jsonld"] = [];
40
44
 
41
45
  if (runtime) {
42
46
  // Plugin contributions come BEFORE site/base, so resolvePageMetadata's
@@ -59,17 +63,30 @@ if (runtime) {
59
63
  const siteContributions = generateSiteSeoContributions(siteSettings.seo);
60
64
  const allContributions = [...pluginContributions, ...siteContributions, ...baseContributions];
61
65
  const resolved = resolvePageMetadata(allContributions);
62
- metadataHtml = renderPageMetadata(resolved);
66
+ jsonLdScripts = resolved.jsonld;
67
+ metadataHtml = renderPageMetadata(resolved, { includeJsonLd: false });
63
68
  siteIdentityHtml = renderSiteIdentity({ favicon: siteSettings.favicon });
64
69
  fragmentsHtml = renderFragments(fragments, "head");
65
70
  } else {
66
71
  // No runtime (Dineway not initialized) — still render base SEO
67
72
  const baseContributions: PageMetadataContribution[] = generateBaseSeoContributions(page);
68
73
  const resolved = resolvePageMetadata(baseContributions);
69
- metadataHtml = renderPageMetadata(resolved);
74
+ jsonLdScripts = resolved.jsonld;
75
+ metadataHtml = renderPageMetadata(resolved, { includeJsonLd: false });
76
+ }
77
+
78
+ if (Astro.csp && jsonLdScripts.length > 0) {
79
+ await Promise.all(
80
+ jsonLdScripts.map(async ({ json }) => {
81
+ Astro.csp?.insertScriptHash(await createSha256CspHash(json));
82
+ }),
83
+ );
70
84
  }
71
85
  ---
72
86
 
73
87
  <Fragment set:html={metadataHtml} />
88
+ {
89
+ jsonLdScripts.map(({ json }) => <JsonLdScript json={json} />)
90
+ }
74
91
  <Fragment set:html={siteIdentityHtml} />
75
92
  <Fragment set:html={fragmentsHtml} />