@ekrist1/vulse 0.1.6-alpha.3

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 (481) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/admin/client/active-locale.d.ts +3 -0
  4. package/dist/admin/client/active-locale.d.ts.map +1 -0
  5. package/dist/admin/client/active-locale.js +14 -0
  6. package/dist/admin/client/api.d.ts +14 -0
  7. package/dist/admin/client/api.d.ts.map +1 -0
  8. package/dist/admin/client/api.js +26 -0
  9. package/dist/admin/client/form-from-zod.d.ts +2 -0
  10. package/dist/admin/client/form-from-zod.d.ts.map +1 -0
  11. package/dist/admin/client/form-from-zod.js +1 -0
  12. package/dist/admin/client/live-preview-enabled.d.ts +3 -0
  13. package/dist/admin/client/live-preview-enabled.d.ts.map +1 -0
  14. package/dist/admin/client/live-preview-enabled.js +6 -0
  15. package/dist/cli/collection-scaffold.d.ts +14 -0
  16. package/dist/cli/collection-scaffold.d.ts.map +1 -0
  17. package/dist/cli/collection-scaffold.js +44 -0
  18. package/dist/cli/index.d.ts +3 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +74 -0
  21. package/dist/cli/migrate.d.ts +5 -0
  22. package/dist/cli/migrate.d.ts.map +1 -0
  23. package/dist/cli/migrate.js +10 -0
  24. package/dist/cli/platform.d.ts +12 -0
  25. package/dist/cli/platform.d.ts.map +1 -0
  26. package/dist/cli/platform.js +38 -0
  27. package/dist/cli/seed-admin.d.ts +19 -0
  28. package/dist/cli/seed-admin.d.ts.map +1 -0
  29. package/dist/cli/seed-admin.js +59 -0
  30. package/dist/cli/setup.d.ts +29 -0
  31. package/dist/cli/setup.d.ts.map +1 -0
  32. package/dist/cli/setup.js +254 -0
  33. package/dist/core/access.d.ts +5 -0
  34. package/dist/core/access.d.ts.map +1 -0
  35. package/dist/core/access.js +6 -0
  36. package/dist/core/blocks/schema.d.ts +81 -0
  37. package/dist/core/blocks/schema.d.ts.map +1 -0
  38. package/dist/core/blocks/schema.js +54 -0
  39. package/dist/core/blueprints/code-to-definition.d.ts +6 -0
  40. package/dist/core/blueprints/code-to-definition.d.ts.map +1 -0
  41. package/dist/core/blueprints/code-to-definition.js +147 -0
  42. package/dist/core/blueprints/compile.d.ts +10 -0
  43. package/dist/core/blueprints/compile.d.ts.map +1 -0
  44. package/dist/core/blueprints/compile.js +153 -0
  45. package/dist/core/blueprints/define.d.ts +6 -0
  46. package/dist/core/blueprints/define.d.ts.map +1 -0
  47. package/dist/core/blueprints/define.js +8 -0
  48. package/dist/core/blueprints/definition.d.ts +963 -0
  49. package/dist/core/blueprints/definition.d.ts.map +1 -0
  50. package/dist/core/blueprints/definition.js +151 -0
  51. package/dist/core/blueprints/load.d.ts +11 -0
  52. package/dist/core/blueprints/load.d.ts.map +1 -0
  53. package/dist/core/blueprints/load.js +137 -0
  54. package/dist/core/blueprints/mutations.d.ts +8 -0
  55. package/dist/core/blueprints/mutations.d.ts.map +1 -0
  56. package/dist/core/blueprints/mutations.js +191 -0
  57. package/dist/core/blueprints/preview-path.d.ts +15 -0
  58. package/dist/core/blueprints/preview-path.d.ts.map +1 -0
  59. package/dist/core/blueprints/preview-path.js +25 -0
  60. package/dist/core/blueprints/reflect-fields.d.ts +36 -0
  61. package/dist/core/blueprints/reflect-fields.d.ts.map +1 -0
  62. package/dist/core/blueprints/reflect-fields.js +229 -0
  63. package/dist/core/blueprints/registry.d.ts +9 -0
  64. package/dist/core/blueprints/registry.d.ts.map +1 -0
  65. package/dist/core/blueprints/registry.js +11 -0
  66. package/dist/core/blueprints/seed.d.ts +5 -0
  67. package/dist/core/blueprints/seed.d.ts.map +1 -0
  68. package/dist/core/blueprints/seed.js +17 -0
  69. package/dist/core/blueprints/select-helpers.d.ts +10 -0
  70. package/dist/core/blueprints/select-helpers.d.ts.map +1 -0
  71. package/dist/core/blueprints/select-helpers.js +26 -0
  72. package/dist/core/blueprints/seo.d.ts +41 -0
  73. package/dist/core/blueprints/seo.d.ts.map +1 -0
  74. package/dist/core/blueprints/seo.js +125 -0
  75. package/dist/core/blueprints/types.d.ts +60 -0
  76. package/dist/core/blueprints/types.d.ts.map +1 -0
  77. package/dist/core/blueprints/types.js +1 -0
  78. package/dist/core/blueprints/zod-helpers.d.ts +79 -0
  79. package/dist/core/blueprints/zod-helpers.d.ts.map +1 -0
  80. package/dist/core/blueprints/zod-helpers.js +72 -0
  81. package/dist/core/db.d.ts +7 -0
  82. package/dist/core/db.d.ts.map +1 -0
  83. package/dist/core/db.js +8 -0
  84. package/dist/core/errors.d.ts +21 -0
  85. package/dist/core/errors.d.ts.map +1 -0
  86. package/dist/core/errors.js +29 -0
  87. package/dist/core/forms/compile.d.ts +9 -0
  88. package/dist/core/forms/compile.d.ts.map +1 -0
  89. package/dist/core/forms/compile.js +80 -0
  90. package/dist/core/forms/definition.d.ts +226 -0
  91. package/dist/core/forms/definition.d.ts.map +1 -0
  92. package/dist/core/forms/definition.js +83 -0
  93. package/dist/core/forms/rate-limit.d.ts +10 -0
  94. package/dist/core/forms/rate-limit.d.ts.map +1 -0
  95. package/dist/core/forms/rate-limit.js +31 -0
  96. package/dist/core/forms/unique.d.ts +5 -0
  97. package/dist/core/forms/unique.d.ts.map +1 -0
  98. package/dist/core/forms/unique.js +30 -0
  99. package/dist/core/globals/compile.d.ts +13 -0
  100. package/dist/core/globals/compile.d.ts.map +1 -0
  101. package/dist/core/globals/compile.js +17 -0
  102. package/dist/core/globals/definition.d.ts +161 -0
  103. package/dist/core/globals/definition.d.ts.map +1 -0
  104. package/dist/core/globals/definition.js +23 -0
  105. package/dist/core/locales.d.ts +14 -0
  106. package/dist/core/locales.d.ts.map +1 -0
  107. package/dist/core/locales.js +35 -0
  108. package/dist/core/migrations.d.ts +3 -0
  109. package/dist/core/migrations.d.ts.map +1 -0
  110. package/dist/core/migrations.js +41 -0
  111. package/dist/core/parse-content.d.ts +14 -0
  112. package/dist/core/parse-content.d.ts.map +1 -0
  113. package/dist/core/parse-content.js +68 -0
  114. package/dist/core/plugins/definition.d.ts +99 -0
  115. package/dist/core/plugins/definition.d.ts.map +1 -0
  116. package/dist/core/plugins/definition.js +10 -0
  117. package/dist/core/preview-content.d.ts +16 -0
  118. package/dist/core/preview-content.d.ts.map +1 -0
  119. package/dist/core/preview-content.js +8 -0
  120. package/dist/core/repos/entries.d.ts +102 -0
  121. package/dist/core/repos/entries.d.ts.map +1 -0
  122. package/dist/core/repos/entries.js +393 -0
  123. package/dist/core/repos/forms.d.ts +82 -0
  124. package/dist/core/repos/forms.d.ts.map +1 -0
  125. package/dist/core/repos/forms.js +199 -0
  126. package/dist/core/repos/globals.d.ts +31 -0
  127. package/dist/core/repos/globals.d.ts.map +1 -0
  128. package/dist/core/repos/globals.js +150 -0
  129. package/dist/core/repos/media.d.ts +39 -0
  130. package/dist/core/repos/media.d.ts.map +1 -0
  131. package/dist/core/repos/media.js +81 -0
  132. package/dist/core/repos/preview-sessions.d.ts +35 -0
  133. package/dist/core/repos/preview-sessions.d.ts.map +1 -0
  134. package/dist/core/repos/preview-sessions.js +85 -0
  135. package/dist/core/repos/revisions.d.ts +24 -0
  136. package/dist/core/repos/revisions.d.ts.map +1 -0
  137. package/dist/core/repos/revisions.js +44 -0
  138. package/dist/core/repos/settings.d.ts +9 -0
  139. package/dist/core/repos/settings.d.ts.map +1 -0
  140. package/dist/core/repos/settings.js +21 -0
  141. package/dist/core/schema.d.ts +2717 -0
  142. package/dist/core/schema.d.ts.map +1 -0
  143. package/dist/core/schema.js +220 -0
  144. package/dist/core/sets/compile.d.ts +8 -0
  145. package/dist/core/sets/compile.d.ts.map +1 -0
  146. package/dist/core/sets/compile.js +4 -0
  147. package/dist/core/sets/definition.d.ts +53 -0
  148. package/dist/core/sets/definition.d.ts.map +1 -0
  149. package/dist/core/sets/definition.js +7 -0
  150. package/dist/core/sets/service.d.ts +13 -0
  151. package/dist/core/sets/service.d.ts.map +1 -0
  152. package/dist/core/sets/service.js +68 -0
  153. package/dist/core/sets/validate-tree.d.ts +4 -0
  154. package/dist/core/sets/validate-tree.d.ts.map +1 -0
  155. package/dist/core/sets/validate-tree.js +40 -0
  156. package/dist/core/slug.d.ts +5 -0
  157. package/dist/core/slug.d.ts.map +1 -0
  158. package/dist/core/slug.js +25 -0
  159. package/dist/index.d.ts +16 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +19 -0
  162. package/dist/integration/cron.d.ts +4 -0
  163. package/dist/integration/cron.d.ts.map +1 -0
  164. package/dist/integration/cron.js +2 -0
  165. package/dist/integration/index.d.ts +9 -0
  166. package/dist/integration/index.d.ts.map +1 -0
  167. package/dist/integration/index.js +63 -0
  168. package/dist/integration/inject-admin-routes.d.ts +12 -0
  169. package/dist/integration/inject-admin-routes.d.ts.map +1 -0
  170. package/dist/integration/inject-admin-routes.js +35 -0
  171. package/dist/integration/inject-routes.d.ts +11 -0
  172. package/dist/integration/inject-routes.d.ts.map +1 -0
  173. package/dist/integration/inject-routes.js +51 -0
  174. package/dist/integration/install-hook.d.ts +2 -0
  175. package/dist/integration/install-hook.d.ts.map +1 -0
  176. package/dist/integration/install-hook.js +74 -0
  177. package/dist/integration/live-preview-middleware-helpers.d.ts +29 -0
  178. package/dist/integration/live-preview-middleware-helpers.d.ts.map +1 -0
  179. package/dist/integration/live-preview-middleware-helpers.js +75 -0
  180. package/dist/integration/loader-binding.d.ts +6 -0
  181. package/dist/integration/loader-binding.d.ts.map +1 -0
  182. package/dist/integration/loader-binding.js +15 -0
  183. package/dist/integration/middleware.d.ts +2 -0
  184. package/dist/integration/middleware.d.ts.map +1 -0
  185. package/dist/integration/middleware.js +51 -0
  186. package/dist/integration/type-gen.d.ts +2 -0
  187. package/dist/integration/type-gen.d.ts.map +1 -0
  188. package/dist/integration/type-gen.js +26 -0
  189. package/dist/integration/vite-plugin-blueprints.d.ts +3 -0
  190. package/dist/integration/vite-plugin-blueprints.d.ts.map +1 -0
  191. package/dist/integration/vite-plugin-blueprints.js +33 -0
  192. package/dist/integration/wrangler-patch.d.ts +6 -0
  193. package/dist/integration/wrangler-patch.d.ts.map +1 -0
  194. package/dist/integration/wrangler-patch.js +18 -0
  195. package/dist/integration.d.ts +3 -0
  196. package/dist/integration.d.ts.map +1 -0
  197. package/dist/integration.js +1 -0
  198. package/dist/loader.d.ts +3 -0
  199. package/dist/loader.d.ts.map +1 -0
  200. package/dist/loader.js +1 -0
  201. package/dist/package-name.d.ts +3 -0
  202. package/dist/package-name.d.ts.map +1 -0
  203. package/dist/package-name.js +2 -0
  204. package/dist/scaffold/collection-write.d.ts +14 -0
  205. package/dist/scaffold/collection-write.d.ts.map +1 -0
  206. package/dist/scaffold/collection-write.js +59 -0
  207. package/dist/scaffold/collection.d.ts +36 -0
  208. package/dist/scaffold/collection.d.ts.map +1 -0
  209. package/dist/scaffold/collection.js +231 -0
  210. package/dist/server/assets/live-preview-bridge.content.d.ts +2 -0
  211. package/dist/server/assets/live-preview-bridge.content.d.ts.map +1 -0
  212. package/dist/server/assets/live-preview-bridge.content.js +2 -0
  213. package/dist/server/better-auth.d.ts +71 -0
  214. package/dist/server/better-auth.d.ts.map +1 -0
  215. package/dist/server/better-auth.js +68 -0
  216. package/dist/server/cf-images.d.ts +12 -0
  217. package/dist/server/cf-images.d.ts.map +1 -0
  218. package/dist/server/cf-images.js +27 -0
  219. package/dist/server/cron.d.ts +9 -0
  220. package/dist/server/cron.d.ts.map +1 -0
  221. package/dist/server/cron.js +26 -0
  222. package/dist/server/email.d.ts +10 -0
  223. package/dist/server/email.d.ts.map +1 -0
  224. package/dist/server/email.js +9 -0
  225. package/dist/server/endpoints/api-auth.d.ts +5 -0
  226. package/dist/server/endpoints/api-auth.d.ts.map +1 -0
  227. package/dist/server/endpoints/api-auth.js +7 -0
  228. package/dist/server/endpoints/api-vulse-blueprints.d.ts +6 -0
  229. package/dist/server/endpoints/api-vulse-blueprints.d.ts.map +1 -0
  230. package/dist/server/endpoints/api-vulse-blueprints.js +19 -0
  231. package/dist/server/endpoints/api-vulse-entries-locales.d.ts +4 -0
  232. package/dist/server/endpoints/api-vulse-entries-locales.d.ts.map +1 -0
  233. package/dist/server/endpoints/api-vulse-entries-locales.js +9 -0
  234. package/dist/server/endpoints/api-vulse-entries-move.d.ts +3 -0
  235. package/dist/server/endpoints/api-vulse-entries-move.d.ts.map +1 -0
  236. package/dist/server/endpoints/api-vulse-entries-move.js +5 -0
  237. package/dist/server/endpoints/api-vulse-entries-publish.d.ts +3 -0
  238. package/dist/server/endpoints/api-vulse-entries-publish.d.ts.map +1 -0
  239. package/dist/server/endpoints/api-vulse-entries-publish.js +5 -0
  240. package/dist/server/endpoints/api-vulse-entries-tree.d.ts +3 -0
  241. package/dist/server/endpoints/api-vulse-entries-tree.d.ts.map +1 -0
  242. package/dist/server/endpoints/api-vulse-entries-tree.js +5 -0
  243. package/dist/server/endpoints/api-vulse-entries.d.ts +6 -0
  244. package/dist/server/endpoints/api-vulse-entries.d.ts.map +1 -0
  245. package/dist/server/endpoints/api-vulse-entries.js +19 -0
  246. package/dist/server/endpoints/api-vulse-form-handle.d.ts +6 -0
  247. package/dist/server/endpoints/api-vulse-form-handle.d.ts.map +1 -0
  248. package/dist/server/endpoints/api-vulse-form-handle.js +27 -0
  249. package/dist/server/endpoints/api-vulse-form-public.d.ts +3 -0
  250. package/dist/server/endpoints/api-vulse-form-public.d.ts.map +1 -0
  251. package/dist/server/endpoints/api-vulse-form-public.js +5 -0
  252. package/dist/server/endpoints/api-vulse-form-submit.d.ts +3 -0
  253. package/dist/server/endpoints/api-vulse-form-submit.d.ts.map +1 -0
  254. package/dist/server/endpoints/api-vulse-form-submit.js +5 -0
  255. package/dist/server/endpoints/api-vulse-form-upload.d.ts +3 -0
  256. package/dist/server/endpoints/api-vulse-form-upload.d.ts.map +1 -0
  257. package/dist/server/endpoints/api-vulse-form-upload.js +5 -0
  258. package/dist/server/endpoints/api-vulse-forms.d.ts +4 -0
  259. package/dist/server/endpoints/api-vulse-forms.d.ts.map +1 -0
  260. package/dist/server/endpoints/api-vulse-forms.js +9 -0
  261. package/dist/server/endpoints/api-vulse-globals-handle.d.ts +5 -0
  262. package/dist/server/endpoints/api-vulse-globals-handle.d.ts.map +1 -0
  263. package/dist/server/endpoints/api-vulse-globals-handle.js +19 -0
  264. package/dist/server/endpoints/api-vulse-globals-public-handle.d.ts +3 -0
  265. package/dist/server/endpoints/api-vulse-globals-public-handle.d.ts.map +1 -0
  266. package/dist/server/endpoints/api-vulse-globals-public-handle.js +5 -0
  267. package/dist/server/endpoints/api-vulse-globals-public.d.ts +3 -0
  268. package/dist/server/endpoints/api-vulse-globals-public.d.ts.map +1 -0
  269. package/dist/server/endpoints/api-vulse-globals-public.js +5 -0
  270. package/dist/server/endpoints/api-vulse-globals-value.d.ts +3 -0
  271. package/dist/server/endpoints/api-vulse-globals-value.d.ts.map +1 -0
  272. package/dist/server/endpoints/api-vulse-globals-value.js +7 -0
  273. package/dist/server/endpoints/api-vulse-globals.d.ts +4 -0
  274. package/dist/server/endpoints/api-vulse-globals.d.ts.map +1 -0
  275. package/dist/server/endpoints/api-vulse-globals.js +9 -0
  276. package/dist/server/endpoints/api-vulse-media-file.d.ts +3 -0
  277. package/dist/server/endpoints/api-vulse-media-file.d.ts.map +1 -0
  278. package/dist/server/endpoints/api-vulse-media-file.js +5 -0
  279. package/dist/server/endpoints/api-vulse-media-id.d.ts +4 -0
  280. package/dist/server/endpoints/api-vulse-media-id.d.ts.map +1 -0
  281. package/dist/server/endpoints/api-vulse-media-id.js +9 -0
  282. package/dist/server/endpoints/api-vulse-media.d.ts +4 -0
  283. package/dist/server/endpoints/api-vulse-media.d.ts.map +1 -0
  284. package/dist/server/endpoints/api-vulse-media.js +9 -0
  285. package/dist/server/endpoints/api-vulse-preview-bridge.d.ts +3 -0
  286. package/dist/server/endpoints/api-vulse-preview-bridge.d.ts.map +1 -0
  287. package/dist/server/endpoints/api-vulse-preview-bridge.js +9 -0
  288. package/dist/server/endpoints/api-vulse-preview-sessions-id.d.ts +3 -0
  289. package/dist/server/endpoints/api-vulse-preview-sessions-id.d.ts.map +1 -0
  290. package/dist/server/endpoints/api-vulse-preview-sessions-id.js +10 -0
  291. package/dist/server/endpoints/api-vulse-preview-sessions.d.ts +3 -0
  292. package/dist/server/endpoints/api-vulse-preview-sessions.d.ts.map +1 -0
  293. package/dist/server/endpoints/api-vulse-preview-sessions.js +5 -0
  294. package/dist/server/endpoints/api-vulse-preview-start.d.ts +3 -0
  295. package/dist/server/endpoints/api-vulse-preview-start.d.ts.map +1 -0
  296. package/dist/server/endpoints/api-vulse-preview-start.js +5 -0
  297. package/dist/server/endpoints/api-vulse-preview-stop.d.ts +3 -0
  298. package/dist/server/endpoints/api-vulse-preview-stop.d.ts.map +1 -0
  299. package/dist/server/endpoints/api-vulse-preview-stop.js +5 -0
  300. package/dist/server/endpoints/api-vulse-revisions-restore.d.ts +3 -0
  301. package/dist/server/endpoints/api-vulse-revisions-restore.d.ts.map +1 -0
  302. package/dist/server/endpoints/api-vulse-revisions-restore.js +5 -0
  303. package/dist/server/endpoints/api-vulse-revisions.d.ts +3 -0
  304. package/dist/server/endpoints/api-vulse-revisions.d.ts.map +1 -0
  305. package/dist/server/endpoints/api-vulse-revisions.js +5 -0
  306. package/dist/server/endpoints/api-vulse-search.d.ts +3 -0
  307. package/dist/server/endpoints/api-vulse-search.d.ts.map +1 -0
  308. package/dist/server/endpoints/api-vulse-search.js +5 -0
  309. package/dist/server/endpoints/api-vulse-sets.d.ts +6 -0
  310. package/dist/server/endpoints/api-vulse-sets.d.ts.map +1 -0
  311. package/dist/server/endpoints/api-vulse-sets.js +19 -0
  312. package/dist/server/endpoints/api-vulse-settings.d.ts +4 -0
  313. package/dist/server/endpoints/api-vulse-settings.d.ts.map +1 -0
  314. package/dist/server/endpoints/api-vulse-settings.js +9 -0
  315. package/dist/server/endpoints/api-vulse-users-id.d.ts +4 -0
  316. package/dist/server/endpoints/api-vulse-users-id.d.ts.map +1 -0
  317. package/dist/server/endpoints/api-vulse-users-id.js +9 -0
  318. package/dist/server/endpoints/api-vulse-users-reset-password.d.ts +3 -0
  319. package/dist/server/endpoints/api-vulse-users-reset-password.d.ts.map +1 -0
  320. package/dist/server/endpoints/api-vulse-users-reset-password.js +5 -0
  321. package/dist/server/endpoints/api-vulse-users-role.d.ts +4 -0
  322. package/dist/server/endpoints/api-vulse-users-role.d.ts.map +1 -0
  323. package/dist/server/endpoints/api-vulse-users-role.js +6 -0
  324. package/dist/server/endpoints/api-vulse-users.d.ts +3 -0
  325. package/dist/server/endpoints/api-vulse-users.d.ts.map +1 -0
  326. package/dist/server/endpoints/api-vulse-users.js +5 -0
  327. package/dist/server/endpoints/with-runtime.d.ts +2 -0
  328. package/dist/server/endpoints/with-runtime.d.ts.map +1 -0
  329. package/dist/server/endpoints/with-runtime.js +10 -0
  330. package/dist/server/env.d.ts +16 -0
  331. package/dist/server/env.d.ts.map +1 -0
  332. package/dist/server/env.js +9 -0
  333. package/dist/server/envelope.d.ts +15 -0
  334. package/dist/server/envelope.d.ts.map +1 -0
  335. package/dist/server/envelope.js +16 -0
  336. package/dist/server/forms/email.d.ts +8 -0
  337. package/dist/server/forms/email.d.ts.map +1 -0
  338. package/dist/server/forms/email.js +6 -0
  339. package/dist/server/forms/process-submission.d.ts +8 -0
  340. package/dist/server/forms/process-submission.d.ts.map +1 -0
  341. package/dist/server/forms/process-submission.js +75 -0
  342. package/dist/server/forms/queue.d.ts +8 -0
  343. package/dist/server/forms/queue.d.ts.map +1 -0
  344. package/dist/server/forms/queue.js +17 -0
  345. package/dist/server/forms/templates.d.ts +9 -0
  346. package/dist/server/forms/templates.d.ts.map +1 -0
  347. package/dist/server/forms/templates.js +14 -0
  348. package/dist/server/forms/webhook.d.ts +2 -0
  349. package/dist/server/forms/webhook.d.ts.map +1 -0
  350. package/dist/server/forms/webhook.js +17 -0
  351. package/dist/server/handler.d.ts +17 -0
  352. package/dist/server/handler.d.ts.map +1 -0
  353. package/dist/server/handler.js +45 -0
  354. package/dist/server/image-probe.d.ts +6 -0
  355. package/dist/server/image-probe.d.ts.map +1 -0
  356. package/dist/server/image-probe.js +38 -0
  357. package/dist/server/loader.d.ts +10 -0
  358. package/dist/server/loader.d.ts.map +1 -0
  359. package/dist/server/loader.js +42 -0
  360. package/dist/server/plugins.d.ts +17 -0
  361. package/dist/server/plugins.d.ts.map +1 -0
  362. package/dist/server/plugins.js +134 -0
  363. package/dist/server/preview.d.ts +7 -0
  364. package/dist/server/preview.d.ts.map +1 -0
  365. package/dist/server/preview.js +22 -0
  366. package/dist/server/r2.d.ts +8 -0
  367. package/dist/server/r2.d.ts.map +1 -0
  368. package/dist/server/r2.js +9 -0
  369. package/dist/server/routes/blueprints.d.ts +10 -0
  370. package/dist/server/routes/blueprints.d.ts.map +1 -0
  371. package/dist/server/routes/blueprints.js +46 -0
  372. package/dist/server/routes/entries.d.ts +16 -0
  373. package/dist/server/routes/entries.d.ts.map +1 -0
  374. package/dist/server/routes/entries.js +262 -0
  375. package/dist/server/routes/form-submit.d.ts +10 -0
  376. package/dist/server/routes/form-submit.d.ts.map +1 -0
  377. package/dist/server/routes/form-submit.js +155 -0
  378. package/dist/server/routes/form-upload.d.ts +11 -0
  379. package/dist/server/routes/form-upload.d.ts.map +1 -0
  380. package/dist/server/routes/form-upload.js +87 -0
  381. package/dist/server/routes/forms.d.ts +14 -0
  382. package/dist/server/routes/forms.d.ts.map +1 -0
  383. package/dist/server/routes/forms.js +78 -0
  384. package/dist/server/routes/globals-public.d.ts +6 -0
  385. package/dist/server/routes/globals-public.d.ts.map +1 -0
  386. package/dist/server/routes/globals-public.js +30 -0
  387. package/dist/server/routes/globals.d.ts +11 -0
  388. package/dist/server/routes/globals.d.ts.map +1 -0
  389. package/dist/server/routes/globals.js +84 -0
  390. package/dist/server/routes/media.d.ts +23 -0
  391. package/dist/server/routes/media.d.ts.map +1 -0
  392. package/dist/server/routes/media.js +129 -0
  393. package/dist/server/routes/preview-sessions.d.ts +9 -0
  394. package/dist/server/routes/preview-sessions.d.ts.map +1 -0
  395. package/dist/server/routes/preview-sessions.js +74 -0
  396. package/dist/server/routes/preview.d.ts +6 -0
  397. package/dist/server/routes/preview.d.ts.map +1 -0
  398. package/dist/server/routes/preview.js +37 -0
  399. package/dist/server/routes/revisions.d.ts +7 -0
  400. package/dist/server/routes/revisions.d.ts.map +1 -0
  401. package/dist/server/routes/revisions.js +26 -0
  402. package/dist/server/routes/search.d.ts +6 -0
  403. package/dist/server/routes/search.d.ts.map +1 -0
  404. package/dist/server/routes/search.js +28 -0
  405. package/dist/server/routes/sets.d.ts +10 -0
  406. package/dist/server/routes/sets.d.ts.map +1 -0
  407. package/dist/server/routes/sets.js +33 -0
  408. package/dist/server/routes/settings.d.ts +7 -0
  409. package/dist/server/routes/settings.d.ts.map +1 -0
  410. package/dist/server/routes/settings.js +21 -0
  411. package/dist/server/routes/users.d.ts +10 -0
  412. package/dist/server/routes/users.d.ts.map +1 -0
  413. package/dist/server/routes/users.js +113 -0
  414. package/dist/server/runtime.d.ts +49 -0
  415. package/dist/server/runtime.d.ts.map +1 -0
  416. package/dist/server/runtime.js +69 -0
  417. package/dist/server/sdk/collections.d.ts +25 -0
  418. package/dist/server/sdk/collections.d.ts.map +1 -0
  419. package/dist/server/sdk/collections.js +76 -0
  420. package/dist/server/sdk/index.d.ts +45 -0
  421. package/dist/server/sdk/index.d.ts.map +1 -0
  422. package/dist/server/sdk/index.js +13 -0
  423. package/dist/server/sdk/media.d.ts +7 -0
  424. package/dist/server/sdk/media.d.ts.map +1 -0
  425. package/dist/server/sdk/media.js +9 -0
  426. package/dist/server/sdk/search.d.ts +19 -0
  427. package/dist/server/sdk/search.d.ts.map +1 -0
  428. package/dist/server/sdk/search.js +58 -0
  429. package/dist/server.d.ts +8 -0
  430. package/dist/server.d.ts.map +1 -0
  431. package/dist/server.js +6 -0
  432. package/dist/version.d.ts +2 -0
  433. package/dist/version.d.ts.map +1 -0
  434. package/dist/version.js +2 -0
  435. package/migrations/0000_init.sql +114 -0
  436. package/migrations/0001_collections_sets.sql +21 -0
  437. package/migrations/0003_fts.sql +22 -0
  438. package/migrations/0004_forms.sql +58 -0
  439. package/migrations/0005_globals.sql +16 -0
  440. package/migrations/0006_preview_sessions.sql +16 -0
  441. package/migrations/meta/0000_snapshot.json +672 -0
  442. package/migrations/meta/_journal.json +13 -0
  443. package/package.json +130 -0
  444. package/src/client/BlockRenderer.astro +40 -0
  445. package/src/client/BlockRenderer.vue +42 -0
  446. package/src/client/Node.vue +21 -0
  447. package/src/client/ProseMirrorRenderer.vue +31 -0
  448. package/src/client/auth.ts +28 -0
  449. package/src/client/blocks/Blockquote.vue +12 -0
  450. package/src/client/blocks/BulletList.vue +12 -0
  451. package/src/client/blocks/CodeBlock.vue +12 -0
  452. package/src/client/blocks/Emoji.vue +14 -0
  453. package/src/client/blocks/HardBreak.vue +1 -0
  454. package/src/client/blocks/Heading.vue +17 -0
  455. package/src/client/blocks/ListItem.vue +12 -0
  456. package/src/client/blocks/OrderedList.vue +12 -0
  457. package/src/client/blocks/Paragraph.vue +12 -0
  458. package/src/client/blocks/Text.vue +33 -0
  459. package/src/client/blocks/VulseAccordion.vue +16 -0
  460. package/src/client/blocks/VulseAccordionGroup.vue +12 -0
  461. package/src/client/blocks/VulseCallout.vue +14 -0
  462. package/src/client/blocks/VulseIframe.vue +65 -0
  463. package/src/client/blocks/VulseImage.vue +30 -0
  464. package/src/client/blocks/VulseSet.vue +26 -0
  465. package/src/client/blocks/VulseVideo.vue +18 -0
  466. package/src/client/components/ForgotPasswordForm.astro +71 -0
  467. package/src/client/components/FormRenderer.astro +40 -0
  468. package/src/client/components/ResetPasswordForm.astro +72 -0
  469. package/src/client/components/SessionGuard.astro +27 -0
  470. package/src/client/components/SignInForm.astro +57 -0
  471. package/src/client/components/SignOutButton.astro +22 -0
  472. package/src/client/components/SignUpForm.astro +61 -0
  473. package/src/client/components/VulseImage.vue +25 -0
  474. package/src/client/embed.ts +52 -0
  475. package/src/client/index.ts +2 -0
  476. package/src/client/inject.ts +4 -0
  477. package/src/client/live-preview-bridge.ts +20 -0
  478. package/src/client/pm-defaults.ts +38 -0
  479. package/src/client/pm-types.ts +21 -0
  480. package/src/client/render-pm-html.ts +154 -0
  481. package/src/client/url.ts +35 -0
@@ -0,0 +1,36 @@
1
+ export interface ScaffoldField {
2
+ name: string;
3
+ ui: {
4
+ kind: string;
5
+ };
6
+ }
7
+ export interface CollectionScaffoldInput {
8
+ handle: string;
9
+ label: string;
10
+ showRoute: string;
11
+ indexRoute?: string;
12
+ titleField?: string;
13
+ fields?: ScaffoldField[];
14
+ }
15
+ export interface ScaffoldFile {
16
+ path: string;
17
+ content: string;
18
+ }
19
+ export declare function defaultScaffoldRoutes(handle: string): {
20
+ showRoute: string;
21
+ indexRoute: string;
22
+ };
23
+ export declare function deriveUrlSegment(showRoute: string, indexRoute?: string): string;
24
+ export declare function resolveTitleField(input: CollectionScaffoldInput): string;
25
+ export declare function generateCodeBlueprint(input: CollectionScaffoldInput): string;
26
+ export declare function generateShowPage(input: CollectionScaffoldInput): string;
27
+ export declare function generateIndexPage(input: CollectionScaffoldInput): string | null;
28
+ export declare function patchContentConfig(existing: string, input: CollectionScaffoldInput): string;
29
+ export declare function generateContentConfig(input: CollectionScaffoldInput): string;
30
+ export declare function scaffoldCliCommand(input: CollectionScaffoldInput): string;
31
+ export declare function generateCollectionScaffoldFiles(input: CollectionScaffoldInput, opts?: {
32
+ includeBlueprint?: boolean;
33
+ includeContentConfig?: boolean;
34
+ includeIndex?: boolean;
35
+ }): ScaffoldFile[];
36
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/scaffold/collection.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAK/F;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAKxE;AAkED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CA0B5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CA8BvE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,GAAG,IAAI,CA4B/E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAsB3F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAYzE;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,uBAAuB,EAC9B,IAAI,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAChG,YAAY,EAAE,CAkChB"}
@@ -0,0 +1,231 @@
1
+ import { VULSE_PACKAGE } from '../package-name.js';
2
+ export function defaultScaffoldRoutes(handle) {
3
+ if (handle === 'page') {
4
+ return { showRoute: '/{slug}', indexRoute: '' };
5
+ }
6
+ return { showRoute: `/${handle}/{slug}`, indexRoute: `/${handle}` };
7
+ }
8
+ export function deriveUrlSegment(showRoute, indexRoute) {
9
+ const index = (indexRoute ?? '').replace(/\/$/, '');
10
+ if (index && index !== '/')
11
+ return index.replace(/^\//, '');
12
+ const showBase = showRoute.replace(/\{slug\}/g, '').replace(/\/$/, '');
13
+ if (!showBase || showBase === '/')
14
+ return '';
15
+ return showBase.replace(/^\//, '');
16
+ }
17
+ export function resolveTitleField(input) {
18
+ if (input.titleField)
19
+ return input.titleField;
20
+ const fields = input.fields ?? [];
21
+ if (fields.some((f) => f.name === 'title'))
22
+ return 'title';
23
+ return fields[0]?.name ?? 'title';
24
+ }
25
+ function zodSchemaField(field) {
26
+ switch (field.ui.kind) {
27
+ case 'blocks':
28
+ return 'blocks()';
29
+ case 'boolean':
30
+ return 'z.boolean()';
31
+ case 'number':
32
+ return 'z.number()';
33
+ case 'date':
34
+ return 'z.coerce.date()';
35
+ default:
36
+ return 'z.string()';
37
+ }
38
+ }
39
+ function contentConfigZodField(field) {
40
+ switch (field.ui.kind) {
41
+ case 'blocks':
42
+ return 'z.any().optional()';
43
+ case 'boolean':
44
+ return 'z.boolean().optional()';
45
+ case 'number':
46
+ return 'z.number().optional()';
47
+ case 'date':
48
+ return 'z.string().optional()';
49
+ default:
50
+ return 'z.string().optional()';
51
+ }
52
+ }
53
+ function buildCodeSchemaLines(fields) {
54
+ const lines = fields.length > 0
55
+ ? fields.map((f) => ` ${f.name}: ${zodSchemaField(f)},`)
56
+ : [
57
+ ' title: z.string().min(1),',
58
+ ' slug: z.string(),',
59
+ ' body: blocks(),',
60
+ ];
61
+ if (!lines.some((l) => l.includes('slug:'))) {
62
+ lines.push(' slug: z.string(),');
63
+ }
64
+ return lines;
65
+ }
66
+ function buildContentConfigSchemaLines(fields) {
67
+ const lines = fields.length > 0
68
+ ? fields.map((f) => ` ${f.name}: ${contentConfigZodField(f)},`)
69
+ : [
70
+ ' title: z.string(),',
71
+ ' slug: z.string(),',
72
+ ' body: z.any().optional(),',
73
+ ];
74
+ if (!lines.some((l) => l.includes('slug:'))) {
75
+ lines.push(' slug: z.string(),');
76
+ }
77
+ lines.push(' id: z.string().optional(),', ' status: z.enum([\'draft\', \'published\']).optional(),', ' publishedAt: z.string().nullable().optional(),', ' updatedAt: z.string().optional(),');
78
+ return lines;
79
+ }
80
+ export function generateCodeBlueprint(input) {
81
+ const titleField = resolveTitleField(input);
82
+ const fields = input.fields ?? [];
83
+ const listColumns = fields.length > 0
84
+ ? fields.slice(0, 3).map((f) => `'${f.name}'`).join(', ')
85
+ : `'${titleField}', 'slug'`;
86
+ const schemaLines = buildCodeSchemaLines(fields).join('\n');
87
+ return `import { defineCollection, z, blocks } from '${VULSE_PACKAGE}'
88
+
89
+ export default defineCollection({
90
+ name: '${input.handle}',
91
+ label: '${input.label.replace(/'/g, "\\'")}',
92
+ schema: z.object({
93
+ ${schemaLines}
94
+ }),
95
+ admin: { titleField: '${titleField}', listColumns: [${listColumns}] },
96
+ preview: { path: '${input.showRoute}' },
97
+ access: {
98
+ read: ({ user, entry }) => entry?.status === 'published' || !!user,
99
+ create: ({ user }) => user?.role === 'admin' || user?.role === 'editor',
100
+ update: ({ user }) => user?.role === 'admin' || user?.role === 'editor',
101
+ delete: ({ user }) => user?.role === 'admin',
102
+ },
103
+ })
104
+ `;
105
+ }
106
+ export function generateShowPage(input) {
107
+ const titleField = resolveTitleField(input);
108
+ const hasBlocks = (input.fields ?? []).some((f) => f.ui.kind === 'blocks');
109
+ const blockImport = hasBlocks || (input.fields ?? []).length === 0
110
+ ? `import BlockRenderer from '${VULSE_PACKAGE}/client/BlockRenderer.astro'\n`
111
+ : '';
112
+ const blockRender = hasBlocks || (input.fields ?? []).length === 0
113
+ ? `\n <BlockRenderer blocks={content.body ?? []} mediaUrl={(id) => \`/api/vulse/media/\${id}/file\`} />`
114
+ : '';
115
+ return `---
116
+ import { getRuntimeEnv, getRuntime, createDb, registryForRequest, resolvePreviewContent } from '${VULSE_PACKAGE}/server'
117
+ ${blockImport}
118
+ const slug = Astro.params.slug!
119
+ const env = getRuntimeEnv()
120
+ const db = createDb(env.DB)
121
+ const rt = await getRuntime(env, await registryForRequest(db), Astro.url.origin)
122
+ const session = await rt.auth.api.getSession({ headers: Astro.request.headers })
123
+
124
+ const entry = await rt.sdk.collections.findBySlug('${input.handle}', slug, {
125
+ ...(session?.user ? { audience: session.user } : {}),
126
+ })
127
+ if (!entry) return new Response(null, { status: 404, statusText: 'Not found' })
128
+
129
+ const content = resolvePreviewContent(entry, Astro.locals) as Record<string, unknown>
130
+ ---
131
+ <article>
132
+ <h1>{String(content.${titleField} ?? slug)}</h1>${blockRender}
133
+ </article>
134
+ `;
135
+ }
136
+ export function generateIndexPage(input) {
137
+ const indexRoute = input.indexRoute?.trim();
138
+ if (!indexRoute || indexRoute === '/')
139
+ return null;
140
+ const titleField = resolveTitleField(input);
141
+ const segment = deriveUrlSegment(input.showRoute, input.indexRoute);
142
+ const hrefPrefix = segment ? `/${segment}` : '';
143
+ return `---
144
+ import { getCollection } from 'astro:content'
145
+
146
+ const entries = (await getCollection('${input.handle}')).sort((a, b) =>
147
+ String(a.data.${titleField} ?? a.data.slug ?? '').localeCompare(String(b.data.${titleField} ?? b.data.slug ?? '')),
148
+ )
149
+ ---
150
+ <section>
151
+ <h1>${input.label.replace(/'/g, "\\'")}</h1>
152
+ <ul>
153
+ {entries.map((entry) => (
154
+ <li>
155
+ <a href={\`${hrefPrefix}/\${entry.data.slug}\`}>
156
+ {String(entry.data.${titleField} ?? entry.data.slug)}
157
+ </a>
158
+ </li>
159
+ ))}
160
+ </ul>
161
+ </section>
162
+ `;
163
+ }
164
+ export function patchContentConfig(existing, input) {
165
+ if (existing.includes(`${input.handle}:`))
166
+ return existing;
167
+ const schemaLines = buildContentConfigSchemaLines(input.fields ?? []).join('\n');
168
+ const entry = `
169
+ ${input.handle}: defineCollection({
170
+ loader: vulseLoader({ collection: '${input.handle}' }),
171
+ schema: z.object({
172
+ ${schemaLines}
173
+ }),
174
+ }),`;
175
+ if (/export const collections = \{/.test(existing)) {
176
+ return existing.replace(/export const collections = \{/, `export const collections = {${entry}`);
177
+ }
178
+ return `import { defineCollection, z } from 'astro:content'
179
+ import { vulseLoader } from '${VULSE_PACKAGE}/loader'
180
+
181
+ export const collections = {${entry}
182
+ }
183
+ `;
184
+ }
185
+ export function generateContentConfig(input) {
186
+ return patchContentConfig('', input);
187
+ }
188
+ export function scaffoldCliCommand(input) {
189
+ const parts = [
190
+ `npx vulse collection:scaffold ${input.handle}`,
191
+ `--route '${input.showRoute}'`,
192
+ ];
193
+ if (input.indexRoute)
194
+ parts.push(`--index '${input.indexRoute}'`);
195
+ if (input.label && input.label !== input.handle) {
196
+ parts.push(`--label '${input.label.replace(/'/g, "'\\''")}'`);
197
+ }
198
+ const titleField = resolveTitleField(input);
199
+ if (titleField !== 'title')
200
+ parts.push(`--title-field ${titleField}`);
201
+ return parts.join(' \\\n ');
202
+ }
203
+ export function generateCollectionScaffoldFiles(input, opts = {}) {
204
+ const includeBlueprint = opts.includeBlueprint ?? true;
205
+ const includeContentConfig = opts.includeContentConfig ?? true;
206
+ const includeIndex = opts.includeIndex ?? !!input.indexRoute?.trim();
207
+ const segment = deriveUrlSegment(input.showRoute, input.indexRoute);
208
+ const showPath = segment ? `src/pages/${segment}/[slug].astro` : 'src/pages/[slug].astro';
209
+ const files = [];
210
+ if (includeBlueprint) {
211
+ files.push({
212
+ path: `src/vulse/collections/${input.handle}.ts`,
213
+ content: generateCodeBlueprint(input),
214
+ });
215
+ }
216
+ files.push({ path: showPath, content: generateShowPage(input) });
217
+ if (includeIndex) {
218
+ const indexContent = generateIndexPage(input);
219
+ if (indexContent) {
220
+ const indexPath = segment ? `src/pages/${segment}/index.astro` : 'src/pages/index.astro';
221
+ files.push({ path: indexPath, content: indexContent });
222
+ }
223
+ }
224
+ if (includeContentConfig) {
225
+ files.push({
226
+ path: 'src/content.config.ts',
227
+ content: generateContentConfig(input),
228
+ });
229
+ }
230
+ return files;
231
+ }
@@ -0,0 +1,2 @@
1
+ export declare const livePreviewBridgeSource = "// ../../node_modules/.pnpm/morphdom@2.7.8/node_modules/morphdom/dist/morphdom-esm.js\nvar DOCUMENT_FRAGMENT_NODE = 11;\nfunction morphAttrs(fromNode, toNode) {\n var toNodeAttrs = toNode.attributes;\n var attr;\n var attrName;\n var attrNamespaceURI;\n var attrValue;\n var fromValue;\n if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n attr = toNodeAttrs[i];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n attrValue = attr.value;\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n if (fromValue !== attrValue) {\n if (attr.prefix === \"xmlns\") {\n attrName = attr.name;\n }\n fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n }\n } else {\n fromValue = fromNode.getAttribute(attrName);\n if (fromValue !== attrValue) {\n fromNode.setAttribute(attrName, attrValue);\n }\n }\n }\n var fromNodeAttrs = fromNode.attributes;\n for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n attr = fromNodeAttrs[d];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n }\n } else {\n if (!toNode.hasAttribute(attrName)) {\n fromNode.removeAttribute(attrName);\n }\n }\n }\n}\nvar range;\nvar NS_XHTML = \"http://www.w3.org/1999/xhtml\";\nvar doc = typeof document === \"undefined\" ? void 0 : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && \"content\" in doc.createElement(\"template\");\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && \"createContextualFragment\" in doc.createRange();\nfunction createFragmentFromTemplate(str) {\n var template = doc.createElement(\"template\");\n template.innerHTML = str;\n return template.content.childNodes[0];\n}\nfunction createFragmentFromRange(str) {\n if (!range) {\n range = doc.createRange();\n range.selectNode(doc.body);\n }\n var fragment = range.createContextualFragment(str);\n return fragment.childNodes[0];\n}\nfunction createFragmentFromWrap(str) {\n var fragment = doc.createElement(\"body\");\n fragment.innerHTML = str;\n return fragment.childNodes[0];\n}\nfunction toElement(str) {\n str = str.trim();\n if (HAS_TEMPLATE_SUPPORT) {\n return createFragmentFromTemplate(str);\n } else if (HAS_RANGE_SUPPORT) {\n return createFragmentFromRange(str);\n }\n return createFragmentFromWrap(str);\n}\nfunction compareNodeNames(fromEl, toEl) {\n var fromNodeName = fromEl.nodeName;\n var toNodeName = toEl.nodeName;\n var fromCodeStart, toCodeStart;\n if (fromNodeName === toNodeName) {\n return true;\n }\n fromCodeStart = fromNodeName.charCodeAt(0);\n toCodeStart = toNodeName.charCodeAt(0);\n if (fromCodeStart <= 90 && toCodeStart >= 97) {\n return fromNodeName === toNodeName.toUpperCase();\n } else if (toCodeStart <= 90 && fromCodeStart >= 97) {\n return toNodeName === fromNodeName.toUpperCase();\n } else {\n return false;\n }\n}\nfunction createElementNS(name, namespaceURI) {\n return !namespaceURI || namespaceURI === NS_XHTML ? doc.createElement(name) : doc.createElementNS(namespaceURI, name);\n}\nfunction moveChildren(fromEl, toEl) {\n var curChild = fromEl.firstChild;\n while (curChild) {\n var nextChild = curChild.nextSibling;\n toEl.appendChild(curChild);\n curChild = nextChild;\n }\n return toEl;\n}\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n if (fromEl[name] !== toEl[name]) {\n fromEl[name] = toEl[name];\n if (fromEl[name]) {\n fromEl.setAttribute(name, \"\");\n } else {\n fromEl.removeAttribute(name);\n }\n }\n}\nvar specialElHandlers = {\n OPTION: function(fromEl, toEl) {\n var parentNode = fromEl.parentNode;\n if (parentNode) {\n var parentName = parentNode.nodeName.toUpperCase();\n if (parentName === \"OPTGROUP\") {\n parentNode = parentNode.parentNode;\n parentName = parentNode && parentNode.nodeName.toUpperCase();\n }\n if (parentName === \"SELECT\" && !parentNode.hasAttribute(\"multiple\")) {\n if (fromEl.hasAttribute(\"selected\") && !toEl.selected) {\n fromEl.setAttribute(\"selected\", \"selected\");\n fromEl.removeAttribute(\"selected\");\n }\n parentNode.selectedIndex = -1;\n }\n }\n syncBooleanAttrProp(fromEl, toEl, \"selected\");\n },\n /**\n * The \"value\" attribute is special for the <input> element since it sets\n * the initial value. Changing the \"value\" attribute without changing the\n * \"value\" property will have no effect since it is only used to the set the\n * initial value. Similar for the \"checked\" attribute, and \"disabled\".\n */\n INPUT: function(fromEl, toEl) {\n syncBooleanAttrProp(fromEl, toEl, \"checked\");\n syncBooleanAttrProp(fromEl, toEl, \"disabled\");\n if (fromEl.value !== toEl.value) {\n fromEl.value = toEl.value;\n }\n if (!toEl.hasAttribute(\"value\")) {\n fromEl.removeAttribute(\"value\");\n }\n },\n TEXTAREA: function(fromEl, toEl) {\n var newValue = toEl.value;\n if (fromEl.value !== newValue) {\n fromEl.value = newValue;\n }\n var firstChild = fromEl.firstChild;\n if (firstChild) {\n var oldValue = firstChild.nodeValue;\n if (oldValue == newValue || !newValue && oldValue == fromEl.placeholder) {\n return;\n }\n firstChild.nodeValue = newValue;\n }\n },\n SELECT: function(fromEl, toEl) {\n if (!toEl.hasAttribute(\"multiple\")) {\n var selectedIndex = -1;\n var i = 0;\n var curChild = fromEl.firstChild;\n var optgroup;\n var nodeName;\n while (curChild) {\n nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n if (nodeName === \"OPTGROUP\") {\n optgroup = curChild;\n curChild = optgroup.firstChild;\n if (!curChild) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n } else {\n if (nodeName === \"OPTION\") {\n if (curChild.hasAttribute(\"selected\")) {\n selectedIndex = i;\n break;\n }\n i++;\n }\n curChild = curChild.nextSibling;\n if (!curChild && optgroup) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n }\n }\n fromEl.selectedIndex = selectedIndex;\n }\n }\n};\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\nfunction noop() {\n}\nfunction defaultGetNodeKey(node) {\n if (node) {\n return node.getAttribute && node.getAttribute(\"id\") || node.id;\n }\n}\nfunction morphdomFactory(morphAttrs2) {\n return function morphdom2(fromNode, toNode, options) {\n if (!options) {\n options = {};\n }\n if (typeof toNode === \"string\") {\n if (fromNode.nodeName === \"#document\" || fromNode.nodeName === \"HTML\") {\n var toNodeHtml = toNode;\n toNode = doc.createElement(\"html\");\n toNode.innerHTML = toNodeHtml;\n } else if (fromNode.nodeName === \"BODY\") {\n var toNodeBody = toNode;\n toNode = doc.createElement(\"html\");\n toNode.innerHTML = toNodeBody;\n var bodyElement = toNode.querySelector(\"body\");\n if (bodyElement) {\n toNode = bodyElement;\n }\n } else {\n toNode = toElement(toNode);\n }\n } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n toNode = toNode.firstElementChild;\n }\n var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n var onNodeAdded = options.onNodeAdded || noop;\n var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n var onElUpdated = options.onElUpdated || noop;\n var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n var onNodeDiscarded = options.onNodeDiscarded || noop;\n var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n var skipFromChildren = options.skipFromChildren || noop;\n var addChild = options.addChild || function(parent, child) {\n return parent.appendChild(child);\n };\n var childrenOnly = options.childrenOnly === true;\n var fromNodesLookup = /* @__PURE__ */ Object.create(null);\n var keyedRemovalList = [];\n function addKeyedRemoval(key) {\n keyedRemovalList.push(key);\n }\n function walkDiscardedChildNodes(node, skipKeyedNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = void 0;\n if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n addKeyedRemoval(key);\n } else {\n onNodeDiscarded(curChild);\n if (curChild.firstChild) {\n walkDiscardedChildNodes(curChild, skipKeyedNodes);\n }\n }\n curChild = curChild.nextSibling;\n }\n }\n }\n function removeNode(node, parentNode, skipKeyedNodes) {\n if (onBeforeNodeDiscarded(node) === false) {\n return;\n }\n if (parentNode) {\n parentNode.removeChild(node);\n }\n onNodeDiscarded(node);\n walkDiscardedChildNodes(node, skipKeyedNodes);\n }\n function indexTree(node) {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = getNodeKey(curChild);\n if (key) {\n fromNodesLookup[key] = curChild;\n }\n indexTree(curChild);\n curChild = curChild.nextSibling;\n }\n }\n }\n indexTree(fromNode);\n function handleNodeAdded(el) {\n onNodeAdded(el);\n var curChild = el.firstChild;\n while (curChild) {\n var nextSibling = curChild.nextSibling;\n var key = getNodeKey(curChild);\n if (key) {\n var unmatchedFromEl = fromNodesLookup[key];\n if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n morphEl(unmatchedFromEl, curChild);\n } else {\n handleNodeAdded(curChild);\n }\n } else {\n handleNodeAdded(curChild);\n }\n curChild = nextSibling;\n }\n }\n function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n while (curFromNodeChild) {\n var fromNextSibling = curFromNodeChild.nextSibling;\n if (curFromNodeKey = getNodeKey(curFromNodeChild)) {\n addKeyedRemoval(curFromNodeKey);\n } else {\n removeNode(\n curFromNodeChild,\n fromEl,\n true\n /* skip keyed nodes */\n );\n }\n curFromNodeChild = fromNextSibling;\n }\n }\n function morphEl(fromEl, toEl, childrenOnly2) {\n var toElKey = getNodeKey(toEl);\n if (toElKey) {\n delete fromNodesLookup[toElKey];\n }\n if (!childrenOnly2) {\n var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n if (beforeUpdateResult === false) {\n return;\n } else if (beforeUpdateResult instanceof HTMLElement) {\n fromEl = beforeUpdateResult;\n indexTree(fromEl);\n }\n morphAttrs2(fromEl, toEl);\n onElUpdated(fromEl);\n if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n return;\n }\n }\n if (fromEl.nodeName !== \"TEXTAREA\") {\n morphChildren(fromEl, toEl);\n } else {\n specialElHandlers.TEXTAREA(fromEl, toEl);\n }\n }\n function morphChildren(fromEl, toEl) {\n var skipFrom = skipFromChildren(fromEl, toEl);\n var curToNodeChild = toEl.firstChild;\n var curFromNodeChild = fromEl.firstChild;\n var curToNodeKey;\n var curFromNodeKey;\n var fromNextSibling;\n var toNextSibling;\n var matchingFromEl;\n outer: while (curToNodeChild) {\n toNextSibling = curToNodeChild.nextSibling;\n curToNodeKey = getNodeKey(curToNodeChild);\n while (!skipFrom && curFromNodeChild) {\n fromNextSibling = curFromNodeChild.nextSibling;\n if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n curFromNodeKey = getNodeKey(curFromNodeChild);\n var curFromNodeType = curFromNodeChild.nodeType;\n var isCompatible = void 0;\n if (curFromNodeType === curToNodeChild.nodeType) {\n if (curFromNodeType === ELEMENT_NODE) {\n if (curToNodeKey) {\n if (curToNodeKey !== curFromNodeKey) {\n if (matchingFromEl = fromNodesLookup[curToNodeKey]) {\n if (fromNextSibling === matchingFromEl) {\n isCompatible = false;\n } else {\n fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n if (curFromNodeKey) {\n addKeyedRemoval(curFromNodeKey);\n } else {\n removeNode(\n curFromNodeChild,\n fromEl,\n true\n /* skip keyed nodes */\n );\n }\n curFromNodeChild = matchingFromEl;\n curFromNodeKey = getNodeKey(curFromNodeChild);\n }\n } else {\n isCompatible = false;\n }\n }\n } else if (curFromNodeKey) {\n isCompatible = false;\n }\n isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n if (isCompatible) {\n morphEl(curFromNodeChild, curToNodeChild);\n }\n } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n isCompatible = true;\n if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n }\n }\n }\n if (isCompatible) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n if (curFromNodeKey) {\n addKeyedRemoval(curFromNodeKey);\n } else {\n removeNode(\n curFromNodeChild,\n fromEl,\n true\n /* skip keyed nodes */\n );\n }\n curFromNodeChild = fromNextSibling;\n }\n if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n if (!skipFrom) {\n addChild(fromEl, matchingFromEl);\n }\n morphEl(matchingFromEl, curToNodeChild);\n } else {\n var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n if (onBeforeNodeAddedResult !== false) {\n if (onBeforeNodeAddedResult) {\n curToNodeChild = onBeforeNodeAddedResult;\n }\n if (curToNodeChild.actualize) {\n curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n }\n addChild(fromEl, curToNodeChild);\n handleNodeAdded(curToNodeChild);\n }\n }\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n }\n cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n var specialElHandler = specialElHandlers[fromEl.nodeName];\n if (specialElHandler) {\n specialElHandler(fromEl, toEl);\n }\n }\n var morphedNode = fromNode;\n var morphedNodeType = morphedNode.nodeType;\n var toNodeType = toNode.nodeType;\n if (!childrenOnly) {\n if (morphedNodeType === ELEMENT_NODE) {\n if (toNodeType === ELEMENT_NODE) {\n if (!compareNodeNames(fromNode, toNode)) {\n onNodeDiscarded(fromNode);\n morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n }\n } else {\n morphedNode = toNode;\n }\n } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) {\n if (toNodeType === morphedNodeType) {\n if (morphedNode.nodeValue !== toNode.nodeValue) {\n morphedNode.nodeValue = toNode.nodeValue;\n }\n return morphedNode;\n } else {\n morphedNode = toNode;\n }\n }\n }\n if (morphedNode === toNode) {\n onNodeDiscarded(fromNode);\n } else {\n if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n return;\n }\n morphEl(morphedNode, toNode, childrenOnly);\n if (keyedRemovalList) {\n for (var i = 0, len = keyedRemovalList.length; i < len; i++) {\n var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n if (elToRemove) {\n removeNode(elToRemove, elToRemove.parentNode, false);\n }\n }\n }\n }\n if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n if (morphedNode.actualize) {\n morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n }\n fromNode.parentNode.replaceChild(morphedNode, fromNode);\n }\n return morphedNode;\n };\n}\nvar morphdom = morphdomFactory(morphAttrs);\nvar morphdom_esm_default = morphdom;\n\n// src/client/live-preview-bridge.ts\nvar ROOT = document.documentElement.dataset.vulsePreviewRoot ?? \"main\";\nwindow.addEventListener(\"message\", async (event) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.name !== \"vulse.preview.updated\") return;\n const res = await fetch(window.location.href, {\n cache: \"no-store\",\n credentials: \"include\",\n headers: { Accept: \"text/html\" }\n });\n if (!res.ok) return;\n const html = await res.text();\n const doc2 = new DOMParser().parseFromString(html, \"text/html\");\n const from = doc2.querySelector(ROOT);\n const to = document.querySelector(ROOT);\n if (from && to) morphdom_esm_default(to, from, { childrenOnly: true });\n});\n";
2
+ //# sourceMappingURL=live-preview-bridge.content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-preview-bridge.content.d.ts","sourceRoot":"","sources":["../../../src/server/assets/live-preview-bridge.content.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,uBAAuB,6nlBAA6nlB,CAAA"}
@@ -0,0 +1,2 @@
1
+ // Generated by build:bridge — do not edit
2
+ export const livePreviewBridgeSource = "// ../../node_modules/.pnpm/morphdom@2.7.8/node_modules/morphdom/dist/morphdom-esm.js\nvar DOCUMENT_FRAGMENT_NODE = 11;\nfunction morphAttrs(fromNode, toNode) {\n var toNodeAttrs = toNode.attributes;\n var attr;\n var attrName;\n var attrNamespaceURI;\n var attrValue;\n var fromValue;\n if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n attr = toNodeAttrs[i];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n attrValue = attr.value;\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n if (fromValue !== attrValue) {\n if (attr.prefix === \"xmlns\") {\n attrName = attr.name;\n }\n fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n }\n } else {\n fromValue = fromNode.getAttribute(attrName);\n if (fromValue !== attrValue) {\n fromNode.setAttribute(attrName, attrValue);\n }\n }\n }\n var fromNodeAttrs = fromNode.attributes;\n for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n attr = fromNodeAttrs[d];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n }\n } else {\n if (!toNode.hasAttribute(attrName)) {\n fromNode.removeAttribute(attrName);\n }\n }\n }\n}\nvar range;\nvar NS_XHTML = \"http://www.w3.org/1999/xhtml\";\nvar doc = typeof document === \"undefined\" ? void 0 : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && \"content\" in doc.createElement(\"template\");\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && \"createContextualFragment\" in doc.createRange();\nfunction createFragmentFromTemplate(str) {\n var template = doc.createElement(\"template\");\n template.innerHTML = str;\n return template.content.childNodes[0];\n}\nfunction createFragmentFromRange(str) {\n if (!range) {\n range = doc.createRange();\n range.selectNode(doc.body);\n }\n var fragment = range.createContextualFragment(str);\n return fragment.childNodes[0];\n}\nfunction createFragmentFromWrap(str) {\n var fragment = doc.createElement(\"body\");\n fragment.innerHTML = str;\n return fragment.childNodes[0];\n}\nfunction toElement(str) {\n str = str.trim();\n if (HAS_TEMPLATE_SUPPORT) {\n return createFragmentFromTemplate(str);\n } else if (HAS_RANGE_SUPPORT) {\n return createFragmentFromRange(str);\n }\n return createFragmentFromWrap(str);\n}\nfunction compareNodeNames(fromEl, toEl) {\n var fromNodeName = fromEl.nodeName;\n var toNodeName = toEl.nodeName;\n var fromCodeStart, toCodeStart;\n if (fromNodeName === toNodeName) {\n return true;\n }\n fromCodeStart = fromNodeName.charCodeAt(0);\n toCodeStart = toNodeName.charCodeAt(0);\n if (fromCodeStart <= 90 && toCodeStart >= 97) {\n return fromNodeName === toNodeName.toUpperCase();\n } else if (toCodeStart <= 90 && fromCodeStart >= 97) {\n return toNodeName === fromNodeName.toUpperCase();\n } else {\n return false;\n }\n}\nfunction createElementNS(name, namespaceURI) {\n return !namespaceURI || namespaceURI === NS_XHTML ? doc.createElement(name) : doc.createElementNS(namespaceURI, name);\n}\nfunction moveChildren(fromEl, toEl) {\n var curChild = fromEl.firstChild;\n while (curChild) {\n var nextChild = curChild.nextSibling;\n toEl.appendChild(curChild);\n curChild = nextChild;\n }\n return toEl;\n}\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n if (fromEl[name] !== toEl[name]) {\n fromEl[name] = toEl[name];\n if (fromEl[name]) {\n fromEl.setAttribute(name, \"\");\n } else {\n fromEl.removeAttribute(name);\n }\n }\n}\nvar specialElHandlers = {\n OPTION: function(fromEl, toEl) {\n var parentNode = fromEl.parentNode;\n if (parentNode) {\n var parentName = parentNode.nodeName.toUpperCase();\n if (parentName === \"OPTGROUP\") {\n parentNode = parentNode.parentNode;\n parentName = parentNode && parentNode.nodeName.toUpperCase();\n }\n if (parentName === \"SELECT\" && !parentNode.hasAttribute(\"multiple\")) {\n if (fromEl.hasAttribute(\"selected\") && !toEl.selected) {\n fromEl.setAttribute(\"selected\", \"selected\");\n fromEl.removeAttribute(\"selected\");\n }\n parentNode.selectedIndex = -1;\n }\n }\n syncBooleanAttrProp(fromEl, toEl, \"selected\");\n },\n /**\n * The \"value\" attribute is special for the <input> element since it sets\n * the initial value. Changing the \"value\" attribute without changing the\n * \"value\" property will have no effect since it is only used to the set the\n * initial value. Similar for the \"checked\" attribute, and \"disabled\".\n */\n INPUT: function(fromEl, toEl) {\n syncBooleanAttrProp(fromEl, toEl, \"checked\");\n syncBooleanAttrProp(fromEl, toEl, \"disabled\");\n if (fromEl.value !== toEl.value) {\n fromEl.value = toEl.value;\n }\n if (!toEl.hasAttribute(\"value\")) {\n fromEl.removeAttribute(\"value\");\n }\n },\n TEXTAREA: function(fromEl, toEl) {\n var newValue = toEl.value;\n if (fromEl.value !== newValue) {\n fromEl.value = newValue;\n }\n var firstChild = fromEl.firstChild;\n if (firstChild) {\n var oldValue = firstChild.nodeValue;\n if (oldValue == newValue || !newValue && oldValue == fromEl.placeholder) {\n return;\n }\n firstChild.nodeValue = newValue;\n }\n },\n SELECT: function(fromEl, toEl) {\n if (!toEl.hasAttribute(\"multiple\")) {\n var selectedIndex = -1;\n var i = 0;\n var curChild = fromEl.firstChild;\n var optgroup;\n var nodeName;\n while (curChild) {\n nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n if (nodeName === \"OPTGROUP\") {\n optgroup = curChild;\n curChild = optgroup.firstChild;\n if (!curChild) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n } else {\n if (nodeName === \"OPTION\") {\n if (curChild.hasAttribute(\"selected\")) {\n selectedIndex = i;\n break;\n }\n i++;\n }\n curChild = curChild.nextSibling;\n if (!curChild && optgroup) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n }\n }\n fromEl.selectedIndex = selectedIndex;\n }\n }\n};\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\nfunction noop() {\n}\nfunction defaultGetNodeKey(node) {\n if (node) {\n return node.getAttribute && node.getAttribute(\"id\") || node.id;\n }\n}\nfunction morphdomFactory(morphAttrs2) {\n return function morphdom2(fromNode, toNode, options) {\n if (!options) {\n options = {};\n }\n if (typeof toNode === \"string\") {\n if (fromNode.nodeName === \"#document\" || fromNode.nodeName === \"HTML\") {\n var toNodeHtml = toNode;\n toNode = doc.createElement(\"html\");\n toNode.innerHTML = toNodeHtml;\n } else if (fromNode.nodeName === \"BODY\") {\n var toNodeBody = toNode;\n toNode = doc.createElement(\"html\");\n toNode.innerHTML = toNodeBody;\n var bodyElement = toNode.querySelector(\"body\");\n if (bodyElement) {\n toNode = bodyElement;\n }\n } else {\n toNode = toElement(toNode);\n }\n } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n toNode = toNode.firstElementChild;\n }\n var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n var onNodeAdded = options.onNodeAdded || noop;\n var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n var onElUpdated = options.onElUpdated || noop;\n var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n var onNodeDiscarded = options.onNodeDiscarded || noop;\n var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n var skipFromChildren = options.skipFromChildren || noop;\n var addChild = options.addChild || function(parent, child) {\n return parent.appendChild(child);\n };\n var childrenOnly = options.childrenOnly === true;\n var fromNodesLookup = /* @__PURE__ */ Object.create(null);\n var keyedRemovalList = [];\n function addKeyedRemoval(key) {\n keyedRemovalList.push(key);\n }\n function walkDiscardedChildNodes(node, skipKeyedNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = void 0;\n if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n addKeyedRemoval(key);\n } else {\n onNodeDiscarded(curChild);\n if (curChild.firstChild) {\n walkDiscardedChildNodes(curChild, skipKeyedNodes);\n }\n }\n curChild = curChild.nextSibling;\n }\n }\n }\n function removeNode(node, parentNode, skipKeyedNodes) {\n if (onBeforeNodeDiscarded(node) === false) {\n return;\n }\n if (parentNode) {\n parentNode.removeChild(node);\n }\n onNodeDiscarded(node);\n walkDiscardedChildNodes(node, skipKeyedNodes);\n }\n function indexTree(node) {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = getNodeKey(curChild);\n if (key) {\n fromNodesLookup[key] = curChild;\n }\n indexTree(curChild);\n curChild = curChild.nextSibling;\n }\n }\n }\n indexTree(fromNode);\n function handleNodeAdded(el) {\n onNodeAdded(el);\n var curChild = el.firstChild;\n while (curChild) {\n var nextSibling = curChild.nextSibling;\n var key = getNodeKey(curChild);\n if (key) {\n var unmatchedFromEl = fromNodesLookup[key];\n if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n morphEl(unmatchedFromEl, curChild);\n } else {\n handleNodeAdded(curChild);\n }\n } else {\n handleNodeAdded(curChild);\n }\n curChild = nextSibling;\n }\n }\n function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n while (curFromNodeChild) {\n var fromNextSibling = curFromNodeChild.nextSibling;\n if (curFromNodeKey = getNodeKey(curFromNodeChild)) {\n addKeyedRemoval(curFromNodeKey);\n } else {\n removeNode(\n curFromNodeChild,\n fromEl,\n true\n /* skip keyed nodes */\n );\n }\n curFromNodeChild = fromNextSibling;\n }\n }\n function morphEl(fromEl, toEl, childrenOnly2) {\n var toElKey = getNodeKey(toEl);\n if (toElKey) {\n delete fromNodesLookup[toElKey];\n }\n if (!childrenOnly2) {\n var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n if (beforeUpdateResult === false) {\n return;\n } else if (beforeUpdateResult instanceof HTMLElement) {\n fromEl = beforeUpdateResult;\n indexTree(fromEl);\n }\n morphAttrs2(fromEl, toEl);\n onElUpdated(fromEl);\n if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n return;\n }\n }\n if (fromEl.nodeName !== \"TEXTAREA\") {\n morphChildren(fromEl, toEl);\n } else {\n specialElHandlers.TEXTAREA(fromEl, toEl);\n }\n }\n function morphChildren(fromEl, toEl) {\n var skipFrom = skipFromChildren(fromEl, toEl);\n var curToNodeChild = toEl.firstChild;\n var curFromNodeChild = fromEl.firstChild;\n var curToNodeKey;\n var curFromNodeKey;\n var fromNextSibling;\n var toNextSibling;\n var matchingFromEl;\n outer: while (curToNodeChild) {\n toNextSibling = curToNodeChild.nextSibling;\n curToNodeKey = getNodeKey(curToNodeChild);\n while (!skipFrom && curFromNodeChild) {\n fromNextSibling = curFromNodeChild.nextSibling;\n if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n curFromNodeKey = getNodeKey(curFromNodeChild);\n var curFromNodeType = curFromNodeChild.nodeType;\n var isCompatible = void 0;\n if (curFromNodeType === curToNodeChild.nodeType) {\n if (curFromNodeType === ELEMENT_NODE) {\n if (curToNodeKey) {\n if (curToNodeKey !== curFromNodeKey) {\n if (matchingFromEl = fromNodesLookup[curToNodeKey]) {\n if (fromNextSibling === matchingFromEl) {\n isCompatible = false;\n } else {\n fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n if (curFromNodeKey) {\n addKeyedRemoval(curFromNodeKey);\n } else {\n removeNode(\n curFromNodeChild,\n fromEl,\n true\n /* skip keyed nodes */\n );\n }\n curFromNodeChild = matchingFromEl;\n curFromNodeKey = getNodeKey(curFromNodeChild);\n }\n } else {\n isCompatible = false;\n }\n }\n } else if (curFromNodeKey) {\n isCompatible = false;\n }\n isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n if (isCompatible) {\n morphEl(curFromNodeChild, curToNodeChild);\n }\n } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n isCompatible = true;\n if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n }\n }\n }\n if (isCompatible) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n if (curFromNodeKey) {\n addKeyedRemoval(curFromNodeKey);\n } else {\n removeNode(\n curFromNodeChild,\n fromEl,\n true\n /* skip keyed nodes */\n );\n }\n curFromNodeChild = fromNextSibling;\n }\n if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n if (!skipFrom) {\n addChild(fromEl, matchingFromEl);\n }\n morphEl(matchingFromEl, curToNodeChild);\n } else {\n var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n if (onBeforeNodeAddedResult !== false) {\n if (onBeforeNodeAddedResult) {\n curToNodeChild = onBeforeNodeAddedResult;\n }\n if (curToNodeChild.actualize) {\n curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n }\n addChild(fromEl, curToNodeChild);\n handleNodeAdded(curToNodeChild);\n }\n }\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n }\n cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n var specialElHandler = specialElHandlers[fromEl.nodeName];\n if (specialElHandler) {\n specialElHandler(fromEl, toEl);\n }\n }\n var morphedNode = fromNode;\n var morphedNodeType = morphedNode.nodeType;\n var toNodeType = toNode.nodeType;\n if (!childrenOnly) {\n if (morphedNodeType === ELEMENT_NODE) {\n if (toNodeType === ELEMENT_NODE) {\n if (!compareNodeNames(fromNode, toNode)) {\n onNodeDiscarded(fromNode);\n morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n }\n } else {\n morphedNode = toNode;\n }\n } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) {\n if (toNodeType === morphedNodeType) {\n if (morphedNode.nodeValue !== toNode.nodeValue) {\n morphedNode.nodeValue = toNode.nodeValue;\n }\n return morphedNode;\n } else {\n morphedNode = toNode;\n }\n }\n }\n if (morphedNode === toNode) {\n onNodeDiscarded(fromNode);\n } else {\n if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n return;\n }\n morphEl(morphedNode, toNode, childrenOnly);\n if (keyedRemovalList) {\n for (var i = 0, len = keyedRemovalList.length; i < len; i++) {\n var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n if (elToRemove) {\n removeNode(elToRemove, elToRemove.parentNode, false);\n }\n }\n }\n }\n if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n if (morphedNode.actualize) {\n morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n }\n fromNode.parentNode.replaceChild(morphedNode, fromNode);\n }\n return morphedNode;\n };\n}\nvar morphdom = morphdomFactory(morphAttrs);\nvar morphdom_esm_default = morphdom;\n\n// src/client/live-preview-bridge.ts\nvar ROOT = document.documentElement.dataset.vulsePreviewRoot ?? \"main\";\nwindow.addEventListener(\"message\", async (event) => {\n if (event.origin !== window.location.origin) return;\n if (event.data?.name !== \"vulse.preview.updated\") return;\n const res = await fetch(window.location.href, {\n cache: \"no-store\",\n credentials: \"include\",\n headers: { Accept: \"text/html\" }\n });\n if (!res.ok) return;\n const html = await res.text();\n const doc2 = new DOMParser().parseFromString(html, \"text/html\");\n const from = doc2.querySelector(ROOT);\n const to = document.querySelector(ROOT);\n if (from && to) morphdom_esm_default(to, from, { childrenOnly: true });\n});\n";
@@ -0,0 +1,71 @@
1
+ import type { VulseDb } from '../core/db.js';
2
+ import type { AuthUserCreateInput } from '../core/plugins/definition.js';
3
+ export interface AuthConfig {
4
+ baseURL: string;
5
+ secret: string;
6
+ /** Override settings row (tests/cron). */
7
+ allowSignUp?: boolean;
8
+ env?: Record<string, unknown>;
9
+ }
10
+ export declare function createAuth(db: VulseDb, config: AuthConfig): Promise<import("better-auth").Auth<{
11
+ baseURL: string;
12
+ secret: string;
13
+ database: (options: import("better-auth").BetterAuthOptions) => import("better-auth").DBAdapter<import("better-auth").BetterAuthOptions>;
14
+ emailAndPassword: {
15
+ enabled: true;
16
+ autoSignIn: true;
17
+ disableSignUp: boolean;
18
+ sendResetPassword: ({ user, url }: {
19
+ user: import("better-auth").User;
20
+ url: string;
21
+ token: string;
22
+ }) => Promise<void>;
23
+ };
24
+ user: {
25
+ additionalFields: {
26
+ role: {
27
+ type: "string";
28
+ defaultValue: string;
29
+ input: false;
30
+ };
31
+ displayName: {
32
+ type: "string";
33
+ required: false;
34
+ };
35
+ };
36
+ };
37
+ session: {
38
+ cookieCache: {
39
+ enabled: true;
40
+ maxAge: number;
41
+ };
42
+ };
43
+ databaseHooks: {
44
+ user: {
45
+ create: {
46
+ before: (user: {
47
+ id: string;
48
+ createdAt: Date;
49
+ updatedAt: Date;
50
+ email: string;
51
+ emailVerified: boolean;
52
+ name: string;
53
+ image?: string | null | undefined;
54
+ } & Record<string, unknown>) => Promise<false | {
55
+ data: AuthUserCreateInput;
56
+ } | undefined>;
57
+ after: (user: {
58
+ id: string;
59
+ createdAt: Date;
60
+ updatedAt: Date;
61
+ email: string;
62
+ emailVerified: boolean;
63
+ name: string;
64
+ image?: string | null | undefined;
65
+ } & Record<string, unknown>) => Promise<void>;
66
+ };
67
+ };
68
+ };
69
+ }>>;
70
+ export type Auth = Awaited<ReturnType<typeof createAuth>>;
71
+ //# sourceMappingURL=better-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../../src/server/better-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAI5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAGxE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAMD,wBAAsB,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0D/D;AAED,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAA"}
@@ -0,0 +1,68 @@
1
+ import { betterAuth } from 'better-auth';
2
+ import { drizzleAdapter } from 'better-auth/adapters/drizzle';
3
+ import * as schema from '../core/schema.js';
4
+ import { SettingsRepo } from '../core/repos/settings.js';
5
+ import { runAuthUserAfterCreateHooks, runAuthUserBeforeCreateHooks } from './plugins.js';
6
+ import { sendEmail } from './email.js';
7
+ function emailDomain(email) {
8
+ return email.split('@')[1]?.toLowerCase() ?? null;
9
+ }
10
+ export async function createAuth(db, config) {
11
+ const settings = new SettingsRepo(db);
12
+ const allowSignUp = config.allowSignUp ?? (await settings.get('allowMemberSignUp')) ?? false;
13
+ const allowedDomains = (await settings.get('allowedSignUpDomains')) ?? [];
14
+ const pluginEnv = config.env;
15
+ return betterAuth({
16
+ baseURL: config.baseURL,
17
+ secret: config.secret,
18
+ database: drizzleAdapter(db, { provider: 'sqlite', schema }),
19
+ emailAndPassword: {
20
+ enabled: true,
21
+ autoSignIn: true,
22
+ disableSignUp: !allowSignUp,
23
+ sendResetPassword: async ({ user, url }) => {
24
+ const emailEnv = pluginEnv;
25
+ void sendEmail(emailEnv ?? {}, {
26
+ to: user.email,
27
+ subject: 'Reset your password',
28
+ body: `Click the link to reset your password:\n\n${url}\n\nIf you did not request this, you can ignore this email.`,
29
+ });
30
+ },
31
+ },
32
+ user: {
33
+ additionalFields: {
34
+ role: { type: 'string', defaultValue: 'member', input: false },
35
+ displayName: { type: 'string', required: false },
36
+ },
37
+ },
38
+ session: {
39
+ cookieCache: { enabled: true, maxAge: 5 * 60 },
40
+ },
41
+ databaseHooks: {
42
+ user: {
43
+ create: {
44
+ before: async (user) => {
45
+ const email = typeof user.email === 'string' ? user.email : '';
46
+ const domain = emailDomain(email);
47
+ if (allowedDomains.length > 0 && (!domain || !allowedDomains.includes(domain))) {
48
+ throw new Error('Email domain not allowed');
49
+ }
50
+ const nextUser = await runAuthUserBeforeCreateHooks({
51
+ user: user,
52
+ }, pluginEnv);
53
+ if (nextUser === false)
54
+ return false;
55
+ if (nextUser)
56
+ return { data: nextUser };
57
+ return undefined;
58
+ },
59
+ after: async (user) => {
60
+ await runAuthUserAfterCreateHooks({
61
+ user: user,
62
+ }, pluginEnv);
63
+ },
64
+ },
65
+ },
66
+ },
67
+ });
68
+ }
@@ -0,0 +1,12 @@
1
+ declare const DEFAULT_VARIANTS: readonly ["thumbnail", "card", "hero", "og"];
2
+ export type Variant = typeof DEFAULT_VARIANTS[number];
3
+ export interface CfImagesConfig {
4
+ accountHash?: string;
5
+ token?: string;
6
+ }
7
+ export declare function isImagesEnabled(cfg: CfImagesConfig): boolean;
8
+ export declare function buildDeliveryUrl(cfg: CfImagesConfig, imageId: string, variant?: Variant | string): string | null;
9
+ /** Called on first migration: ensures default variants exist via the CF Images API. */
10
+ export declare function registerDefaultVariants(cfg: CfImagesConfig): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=cf-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-images.d.ts","sourceRoot":"","sources":["../../src/server/cf-images.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,gBAAgB,8CAA+C,CAAA;AACrE,MAAM,MAAM,OAAO,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;AAErD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,GAAG,MAAe,GAAG,MAAM,GAAG,IAAI,CAGxH;AAED,uFAAuF;AACvF,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAehF"}
@@ -0,0 +1,27 @@
1
+ const DEFAULT_VARIANTS = ['thumbnail', 'card', 'hero', 'og'];
2
+ export function isImagesEnabled(cfg) {
3
+ return !!cfg.accountHash;
4
+ }
5
+ export function buildDeliveryUrl(cfg, imageId, variant = 'card') {
6
+ if (!cfg.accountHash)
7
+ return null;
8
+ return `https://imagedelivery.net/${cfg.accountHash}/${imageId}/${variant}`;
9
+ }
10
+ /** Called on first migration: ensures default variants exist via the CF Images API. */
11
+ export async function registerDefaultVariants(cfg) {
12
+ if (!cfg.token || !cfg.accountHash)
13
+ return;
14
+ const variants = [
15
+ { id: 'thumbnail', options: { fit: 'cover', width: 160, height: 160 } },
16
+ { id: 'card', options: { fit: 'cover', width: 800, height: 450 } },
17
+ { id: 'hero', options: { fit: 'scale-down', width: 1600 } },
18
+ { id: 'og', options: { fit: 'cover', width: 1200, height: 630 } },
19
+ ];
20
+ for (const v of variants) {
21
+ await fetch(`https://api.cloudflare.com/client/v4/accounts/${cfg.accountHash}/images/v1/variants`, {
22
+ method: 'POST',
23
+ headers: { authorization: `Bearer ${cfg.token}`, 'content-type': 'application/json' },
24
+ body: JSON.stringify(v),
25
+ }).catch(() => { });
26
+ }
27
+ }
@@ -0,0 +1,9 @@
1
+ export interface CronEnv {
2
+ DB: D1Database;
3
+ BUCKET: R2Bucket;
4
+ CF_IMAGES_ACCOUNT_HASH?: string;
5
+ CF_IMAGES_TOKEN?: string;
6
+ BETTER_AUTH_SECRET: string;
7
+ }
8
+ export declare function vulseScheduled(env: CronEnv): Promise<void>;
9
+ //# sourceMappingURL=cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/server/cron.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,UAAU,CAAA;IACd,MAAM,EAAE,QAAQ,CAAA;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBhE"}
@@ -0,0 +1,26 @@
1
+ import { createDb } from '../core/db.js';
2
+ import { PreviewSessionsRepo } from '../core/repos/preview-sessions.js';
3
+ import { mediaRoutes } from './routes/media.js';
4
+ import { purgeExpiredFormUploadDrafts } from './routes/form-upload.js';
5
+ import { createAuth } from './better-auth.js';
6
+ export async function vulseScheduled(env) {
7
+ const db = createDb(env.DB);
8
+ const auth = await createAuth(db, {
9
+ baseURL: 'http://localhost',
10
+ secret: env.BETTER_AUTH_SECRET,
11
+ allowSignUp: false,
12
+ });
13
+ const routes = mediaRoutes(db, auth, {
14
+ bucket: env.BUCKET,
15
+ cfImages: {
16
+ ...(env.CF_IMAGES_ACCOUNT_HASH ? { accountHash: env.CF_IMAGES_ACCOUNT_HASH } : {}),
17
+ ...(env.CF_IMAGES_TOKEN ? { token: env.CF_IMAGES_TOKEN } : {}),
18
+ },
19
+ });
20
+ const mediaResult = await routes.purge();
21
+ console.log(`[vulse-cron] purged ${mediaResult.purged} media row(s)`);
22
+ const draftResult = await purgeExpiredFormUploadDrafts(db, env.BUCKET);
23
+ console.log(`[vulse-cron] purged ${draftResult.purged} form upload draft(s)`);
24
+ const previewResult = await new PreviewSessionsRepo(db).purgeExpired(new Date());
25
+ console.log(`[vulse-cron] purged ${previewResult} preview session(s)`);
26
+ }
@@ -0,0 +1,10 @@
1
+ export interface EmailEnv {
2
+ EMAIL_FROM?: string;
3
+ EMAIL_API_TOKEN?: string;
4
+ }
5
+ export declare function sendEmail(env: EmailEnv, input: {
6
+ to: string;
7
+ subject: string;
8
+ body: string;
9
+ }): Promise<'sent' | 'logged'>;
10
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/server/email.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAQ5B"}
@@ -0,0 +1,9 @@
1
+ export async function sendEmail(env, input) {
2
+ if (!env.EMAIL_FROM || !env.EMAIL_API_TOKEN) {
3
+ console.log(`[vulse-email] to=${input.to} subject=${input.subject}\n${input.body}`);
4
+ return 'logged';
5
+ }
6
+ // Placeholder: real Email Workers integration documented in README.
7
+ console.log(`[vulse-email] to=${input.to} subject=${input.subject}`);
8
+ return 'sent';
9
+ }
@@ -0,0 +1,5 @@
1
+ import type { APIRoute } from 'astro';
2
+ export declare const ALL: APIRoute;
3
+ export declare const GET: APIRoute;
4
+ export declare const POST: APIRoute;
5
+ //# sourceMappingURL=api-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-auth.d.ts","sourceRoot":"","sources":["../../../src/server/endpoints/api-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGrC,eAAO,MAAM,GAAG,EAAE,QAGjB,CAAA;AAED,eAAO,MAAM,GAAG,UAAM,CAAA;AACtB,eAAO,MAAM,IAAI,UAAM,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { withRuntime } from './with-runtime.js';
2
+ export const ALL = async ({ request }) => {
3
+ const rt = await withRuntime(request);
4
+ return rt.auth.handler(request);
5
+ };
6
+ export const GET = ALL;
7
+ export const POST = ALL;