@raketa-cloud/admin 1.8.3 → 1.8.6

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 (320) hide show
  1. package/dist/application.css +36 -0
  2. package/package.json +2 -2
  3. package/src/cloud/ResourceChanges.js +41 -0
  4. package/src/cloud/ResourceRevisions.js +242 -0
  5. package/src/cloud/Resources.js +219 -0
  6. package/src/cloud/documents/common.js +0 -30
  7. package/src/cloud/documents/resourcesDocuments.js +371 -0
  8. package/src/handlers/_shared/getResourceUpdateDestination.js +11 -0
  9. package/src/handlers/resource_revisions/CancelSchedulesHandler.js +31 -0
  10. package/src/handlers/resource_revisions/CodeHandler.js +70 -0
  11. package/src/handlers/resource_revisions/GeneralHandler.js +72 -0
  12. package/src/handlers/{article_revisions → resource_revisions}/LocksHandler.js +15 -10
  13. package/src/handlers/resource_revisions/MetaHandler.js +70 -0
  14. package/src/handlers/{article_revisions → resource_revisions}/PublishesHandler.js +27 -19
  15. package/src/handlers/resource_revisions/ResourceRevisionsHandler.js +65 -0
  16. package/src/handlers/{article_revisions → resource_revisions}/RevertsHandler.js +7 -5
  17. package/src/handlers/{page_revisions → resource_revisions}/TagHandler.js +31 -16
  18. package/src/handlers/resource_revisions/UnlocksHandler.js +29 -0
  19. package/src/handlers/resource_revisions/VisualHandler.js +71 -0
  20. package/src/handlers/{article_revisions → resource_revisions}/WidgetHandler.js +11 -6
  21. package/src/handlers/{pages → resources}/ChangeHandler.js +5 -3
  22. package/src/handlers/resources/ClonesHandler.js +24 -0
  23. package/src/handlers/resources/DeletesHandler.js +79 -0
  24. package/src/handlers/{pages → resources}/ExportsHandler.js +8 -4
  25. package/src/handlers/resources/HistoryHandler.js +39 -0
  26. package/src/handlers/{pages/PagesAPIHandler.js → resources/ResourcesAPIHandler.js} +4 -2
  27. package/src/handlers/{pages/PagesHandler.js → resources/ResourcesHandler.js} +35 -18
  28. package/src/handlers/{pages → resources}/TranslationsHandler.js +65 -37
  29. package/src/handlers/resources/URLsHandler.js +84 -0
  30. package/src/helpers/CSVExportHelper.js +5 -6
  31. package/src/index.js +28 -69
  32. package/src/routeArticlesModule.js +7 -167
  33. package/src/routeEventsModule.js +7 -182
  34. package/src/routePagesModule.js +7 -179
  35. package/src/routeResource.js +197 -0
  36. package/src/routeStandard.js +1 -1
  37. package/src/setupCloud.js +10 -30
  38. package/src/tests/HonoAdapter.coverage.test.js +640 -0
  39. package/src/tests/HonoAdapter.test.js +3 -0
  40. package/src/tests/buildResourcePath.test.js +69 -0
  41. package/src/tests/handlers/_shared/getResourceUpdateDestination.test.js +63 -0
  42. package/src/tests/handlers/{article_revisions/CancelScheduledHandler.test → resource_revisions/CancelSchedulesHandler.test}/create.test.js +26 -26
  43. package/src/tests/handlers/{page_revisions/CodesHandler.test → resource_revisions/CodeHandler.test}/edit_form.test.js +13 -16
  44. package/src/tests/handlers/{article_revisions/CodesHandler.test → resource_revisions/CodeHandler.test}/update.test.js +38 -57
  45. package/src/tests/handlers/resource_revisions/GeneralHandler.test/edit_form.test.js +58 -0
  46. package/src/tests/handlers/{article_revisions → resource_revisions}/GeneralHandler.test/update.test.js +39 -53
  47. package/src/tests/handlers/{event_revisions → resource_revisions}/LocksHandler.test/create.test.js +34 -31
  48. package/src/tests/handlers/{event_revisions → resource_revisions}/LocksHandler.test/create_form.test.js +16 -12
  49. package/src/tests/handlers/{page_revisions → resource_revisions}/MetaHandler.test/edit_form.test.js +13 -9
  50. package/src/tests/handlers/{article_revisions → resource_revisions}/MetaHandler.test/update.test.js +38 -57
  51. package/src/tests/handlers/{article_revisions → resource_revisions}/PublishesHandler.test/create.test.js +60 -72
  52. package/src/tests/handlers/{page_revisions → resource_revisions}/PublishesHandler.test/create_form.test.js +14 -10
  53. package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/create.test.js +87 -0
  54. package/src/tests/handlers/{article_revisions/ArticleRevisionsHandler.test → resource_revisions/ResourceRevisionsHandler.test}/destroy.test.js +13 -13
  55. package/src/tests/handlers/resource_revisions/RevertsHandler.test/create.test.js +83 -0
  56. package/src/tests/handlers/{event_revisions → resource_revisions}/TagHandler.test/edit_form.test.js +23 -19
  57. package/src/tests/handlers/{article_revisions → resource_revisions}/TagHandler.test/update.test.js +44 -49
  58. package/src/tests/handlers/{article_revisions → resource_revisions}/UnlocksHandler.test/create.test.js +22 -22
  59. package/src/tests/handlers/{page_revisions/VisualHandler.test.test → resource_revisions/VisualHandler.test}/edit_form.test.js +13 -16
  60. package/src/tests/handlers/resource_revisions/VisualHandler.test/update.test.js +130 -0
  61. package/src/tests/handlers/{event_revisions → resource_revisions}/WidgetHandler.test/show.test.js +11 -7
  62. package/src/tests/handlers/{event_revisions → resource_revisions}/WidgetHandler.test/update.test.js +28 -14
  63. package/src/tests/handlers/resources/ChangeHandler.test/show.test.js +57 -0
  64. package/src/tests/handlers/resources/ClonesHandler.test/create.test.js +57 -0
  65. package/src/tests/handlers/{articles → resources}/DeletesHandler.test/create.test.js +30 -30
  66. package/src/tests/handlers/resources/DeletesHandler.test/create_form.test.js +60 -0
  67. package/src/tests/handlers/{articles → resources}/ExportsHandler.test/index.test.js +57 -57
  68. package/src/tests/handlers/{articles/ArticlesHistoryHandler.test → resources/HistoryHandler.test}/index.test.js +19 -20
  69. package/src/tests/handlers/resources/ResourcesAPIHandler.test/index.test.js +41 -0
  70. package/src/tests/handlers/{pages/PagesHandler.test → resources/ResourcesHandler.test}/create.test.js +23 -22
  71. package/src/tests/handlers/{events/EventsHandler.test → resources/ResourcesHandler.test}/create_form.test.js +12 -11
  72. package/src/tests/handlers/{events/EventsHandler.test → resources/ResourcesHandler.test}/index.test.js +18 -18
  73. package/src/tests/handlers/resources/ResourcesHandler.test/show.test.js +111 -0
  74. package/src/tests/handlers/resources/TranslationsHandler.test/create.test.js +320 -0
  75. package/src/tests/handlers/resources/TranslationsHandler.test/create_form.test.js +85 -0
  76. package/src/tests/handlers/resources/TranslationsHandler.test/index.test.js +99 -0
  77. package/src/tests/handlers/{articles → resources}/URLsHandler.test/create.test.js +48 -43
  78. package/src/tests/handlers/resources/URLsHandler.test/create_form.test.js +55 -0
  79. package/src/tests/routeArticlesModule.test.js +43 -0
  80. package/src/tests/routeCategoriesModule.test.js +23 -0
  81. package/src/tests/routeEventsModule.test.js +43 -0
  82. package/src/tests/routePagesModule.test.js +43 -0
  83. package/src/tests/routeResource.test.js +202 -0
  84. package/src/tests/routeSettings.test.js +40 -0
  85. package/src/tests/routeStandard.test.js +70 -0
  86. package/src/tests/setGlobalContext.test.js +12 -0
  87. package/src/tests/setupAuthentication.test.js +407 -0
  88. package/src/tests/setupCloud.test.js +51 -0
  89. package/src/tests/support/factory.js +15 -86
  90. package/src/views/article_revisions/_nav.ejs +6 -6
  91. package/src/views/article_revisions/codes/_form.ejs +2 -2
  92. package/src/views/article_revisions/general/_form.ejs +3 -3
  93. package/src/views/article_revisions/locks/_form.ejs +2 -2
  94. package/src/views/article_revisions/meta/_form.ejs +2 -2
  95. package/src/views/article_revisions/publishes/_form.ejs +3 -3
  96. package/src/views/article_revisions/tags/_form.ejs +2 -2
  97. package/src/views/article_revisions/visuals/_form.ejs +2 -2
  98. package/src/views/articles/_form.ejs +9 -9
  99. package/src/views/articles/_shared/_export_button.ejs +1 -1
  100. package/src/views/articles/_shared/_history_toolbar.ejs +2 -2
  101. package/src/views/articles/_shared/_revision_operator.ejs +8 -0
  102. package/src/views/articles/_shared/_revision_toolbar.ejs +7 -7
  103. package/src/views/articles/_shared/_title.ejs +2 -2
  104. package/src/views/articles/_shared/_toolbar.ejs +6 -6
  105. package/src/views/articles/_shared/history_table.ejs +1 -1
  106. package/src/views/articles/create_form.ejs +1 -1
  107. package/src/views/articles/deletes/create_form.ejs +3 -3
  108. package/src/views/articles/history/index.ejs +4 -4
  109. package/src/views/articles/index.ejs +14 -12
  110. package/src/views/articles/show.ejs +8 -22
  111. package/src/views/articles/translations/_translation_toolbar.ejs +2 -2
  112. package/src/views/articles/translations/create_form.ejs +2 -2
  113. package/src/views/articles/translations/index.ejs +3 -3
  114. package/src/views/articles/urls/create_form.ejs +3 -3
  115. package/src/views/event_revisions/_nav.ejs +6 -6
  116. package/src/views/event_revisions/codes/_form.ejs +2 -2
  117. package/src/views/event_revisions/general/_form.ejs +5 -5
  118. package/src/views/event_revisions/locks/_form.ejs +2 -2
  119. package/src/views/event_revisions/meta/_form.ejs +2 -2
  120. package/src/views/event_revisions/publishes/_form.ejs +3 -3
  121. package/src/views/event_revisions/tags/_form.ejs +2 -2
  122. package/src/views/event_revisions/visuals/_form.ejs +2 -2
  123. package/src/views/events/_form.ejs +6 -6
  124. package/src/views/events/_shared/_export_button.ejs +1 -1
  125. package/src/views/events/_shared/_history_toolbar.ejs +2 -2
  126. package/src/views/events/_shared/_revision_operator.ejs +8 -0
  127. package/src/views/events/_shared/_revision_toolbar.ejs +7 -7
  128. package/src/views/events/_shared/_title.ejs +2 -2
  129. package/src/views/events/_shared/_toolbar.ejs +6 -6
  130. package/src/views/events/_shared/history_table.ejs +1 -1
  131. package/src/views/events/create_form.ejs +1 -1
  132. package/src/views/events/deletes/create_form.ejs +3 -3
  133. package/src/views/events/history/index.ejs +4 -4
  134. package/src/views/events/index.ejs +14 -12
  135. package/src/views/events/show.ejs +8 -22
  136. package/src/views/events/translations/_translation_toolbar.ejs +2 -2
  137. package/src/views/events/translations/create_form.ejs +2 -2
  138. package/src/views/events/translations/index.ejs +3 -3
  139. package/src/views/events/urls/create_form.ejs +3 -3
  140. package/src/views/layouts/application.ejs +30 -0
  141. package/src/views/page_revisions/_nav.ejs +6 -6
  142. package/src/views/page_revisions/codes/_form.ejs +2 -2
  143. package/src/views/page_revisions/general/_form.ejs +2 -2
  144. package/src/views/page_revisions/locks/_form.ejs +2 -2
  145. package/src/views/page_revisions/meta/_form.ejs +2 -2
  146. package/src/views/page_revisions/publishes/_form.ejs +3 -3
  147. package/src/views/page_revisions/tags/_form.ejs +2 -2
  148. package/src/views/page_revisions/visuals/_form.ejs +2 -2
  149. package/src/views/pages/_form.ejs +3 -3
  150. package/src/views/pages/_shared/_export_button.ejs +1 -1
  151. package/src/views/pages/_shared/_history_toolbar.ejs +2 -2
  152. package/src/views/pages/_shared/_revision_operator.ejs +8 -0
  153. package/src/views/pages/_shared/_revision_toolbar.ejs +7 -7
  154. package/src/views/pages/_shared/_title.ejs +2 -2
  155. package/src/views/pages/_shared/_toolbar.ejs +6 -6
  156. package/src/views/pages/_shared/history_table.ejs +1 -1
  157. package/src/views/pages/create_form.ejs +1 -1
  158. package/src/views/pages/deletes/create_form.ejs +3 -3
  159. package/src/views/pages/history/index.ejs +4 -4
  160. package/src/views/pages/index.ejs +12 -10
  161. package/src/views/pages/show.ejs +8 -22
  162. package/src/views/pages/translations/_translation_toolbar.ejs +2 -2
  163. package/src/views/pages/translations/create_form.ejs +2 -2
  164. package/src/views/pages/translations/index.ejs +3 -3
  165. package/src/views/pages/urls/create_form.ejs +3 -3
  166. package/src/cloud/ArticleChanges.js +0 -36
  167. package/src/cloud/ArticleRevisions.js +0 -239
  168. package/src/cloud/Articles.js +0 -216
  169. package/src/cloud/EventChanges.js +0 -36
  170. package/src/cloud/EventRevisions.js +0 -246
  171. package/src/cloud/Events.js +0 -231
  172. package/src/cloud/PageChanges.js +0 -36
  173. package/src/cloud/PageRevisions.js +0 -226
  174. package/src/cloud/Pages.js +0 -204
  175. package/src/cloud/documents/articlesDocuments.js +0 -375
  176. package/src/cloud/documents/eventsDocuments.js +0 -390
  177. package/src/cloud/documents/pagesDocuments.js +0 -370
  178. package/src/handlers/_shared/getArticlesUpdateDestination.js +0 -7
  179. package/src/handlers/_shared/getEventsUpdateDestination.js +0 -7
  180. package/src/handlers/_shared/getPagesUpdateDestination.js +0 -8
  181. package/src/handlers/article_revisions/ArticleRevisionsHandler.js +0 -57
  182. package/src/handlers/article_revisions/CancelSchedulesHandler.js +0 -26
  183. package/src/handlers/article_revisions/CodeHandler.js +0 -75
  184. package/src/handlers/article_revisions/GeneralHandler.js +0 -77
  185. package/src/handlers/article_revisions/MetaHandler.js +0 -75
  186. package/src/handlers/article_revisions/TagHandler.js +0 -83
  187. package/src/handlers/article_revisions/UnlocksHandler.js +0 -24
  188. package/src/handlers/article_revisions/VisualHandler.js +0 -75
  189. package/src/handlers/articles/ArticlesAPIHandler.js +0 -15
  190. package/src/handlers/articles/ArticlesHandler.js +0 -126
  191. package/src/handlers/articles/ChangeHandler.js +0 -22
  192. package/src/handlers/articles/ClonesHandler.js +0 -19
  193. package/src/handlers/articles/DeletesHandler.js +0 -72
  194. package/src/handlers/articles/ExportsHandler.js +0 -35
  195. package/src/handlers/articles/HistoryHandler.js +0 -31
  196. package/src/handlers/articles/TranslationsHandler.js +0 -231
  197. package/src/handlers/articles/URLsHandler.js +0 -83
  198. package/src/handlers/event_revisions/CancelSchedulesHandler.js +0 -26
  199. package/src/handlers/event_revisions/CodeHandler.js +0 -73
  200. package/src/handlers/event_revisions/EventRevisionsHandler.js +0 -55
  201. package/src/handlers/event_revisions/GeneralHandler.js +0 -75
  202. package/src/handlers/event_revisions/LocksHandler.js +0 -65
  203. package/src/handlers/event_revisions/MetaHandler.js +0 -73
  204. package/src/handlers/event_revisions/PublishesHandler.js +0 -112
  205. package/src/handlers/event_revisions/RevertsHandler.js +0 -26
  206. package/src/handlers/event_revisions/TagHandler.js +0 -80
  207. package/src/handlers/event_revisions/UnlocksHandler.js +0 -24
  208. package/src/handlers/event_revisions/VisualHandler.js +0 -73
  209. package/src/handlers/event_revisions/WidgetHandler.js +0 -41
  210. package/src/handlers/events/ChangeHandler.js +0 -22
  211. package/src/handlers/events/ClonesHandler.js +0 -19
  212. package/src/handlers/events/DeletesHandler.js +0 -72
  213. package/src/handlers/events/EventsAPIHandler.js +0 -15
  214. package/src/handlers/events/EventsHandler.js +0 -128
  215. package/src/handlers/events/ExportsHandler.js +0 -35
  216. package/src/handlers/events/HistoryHandler.js +0 -31
  217. package/src/handlers/events/TranslationsHandler.js +0 -233
  218. package/src/handlers/events/URLsHandler.js +0 -81
  219. package/src/handlers/page_revisions/CancelSchedulesHandler.js +0 -26
  220. package/src/handlers/page_revisions/CodeHandler.js +0 -59
  221. package/src/handlers/page_revisions/GeneralHandler.js +0 -61
  222. package/src/handlers/page_revisions/LocksHandler.js +0 -69
  223. package/src/handlers/page_revisions/MetaHandler.js +0 -59
  224. package/src/handlers/page_revisions/PageRevisionsHandler.js +0 -55
  225. package/src/handlers/page_revisions/PublishesHandler.js +0 -112
  226. package/src/handlers/page_revisions/RevertsHandler.js +0 -26
  227. package/src/handlers/page_revisions/UnlocksHandler.js +0 -22
  228. package/src/handlers/page_revisions/VisualHandler.js +0 -60
  229. package/src/handlers/page_revisions/WidgetHandler.js +0 -41
  230. package/src/handlers/pages/ClonesHandler.js +0 -19
  231. package/src/handlers/pages/DeletesHandler.js +0 -68
  232. package/src/handlers/pages/HistoryHandler.js +0 -31
  233. package/src/handlers/pages/URLsHandler.js +0 -77
  234. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/create.test.js +0 -87
  235. package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +0 -56
  236. package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +0 -59
  237. package/src/tests/handlers/article_revisions/LocksHandler.test/create.test.js +0 -142
  238. package/src/tests/handlers/article_revisions/LocksHandler.test/create_form.test.js +0 -55
  239. package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +0 -56
  240. package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +0 -48
  241. package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +0 -86
  242. package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +0 -72
  243. package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +0 -56
  244. package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +0 -146
  245. package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +0 -46
  246. package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +0 -103
  247. package/src/tests/handlers/articles/ArticlesAPIHandler.test/index.test.js +0 -43
  248. package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +0 -172
  249. package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +0 -44
  250. package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +0 -73
  251. package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +0 -120
  252. package/src/tests/handlers/articles/ChangeHandler.test/show.test.js +0 -59
  253. package/src/tests/handlers/articles/ClonesHandler.test/create.test.js +0 -57
  254. package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +0 -60
  255. package/src/tests/handlers/articles/TranslationHandler.test/create.test.js +0 -297
  256. package/src/tests/handlers/articles/TranslationHandler.test/create_form.test.js +0 -71
  257. package/src/tests/handlers/articles/TranslationHandler.test/index.test.js +0 -91
  258. package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +0 -55
  259. package/src/tests/handlers/event_revisions/CancelScheduledHandler.test/create.test.js +0 -90
  260. package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +0 -60
  261. package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +0 -171
  262. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/create.test.js +0 -87
  263. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/destroy.test.js +0 -57
  264. package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +0 -63
  265. package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +0 -172
  266. package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +0 -60
  267. package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +0 -173
  268. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +0 -333
  269. package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +0 -48
  270. package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +0 -83
  271. package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +0 -163
  272. package/src/tests/handlers/event_revisions/UnlocksHandler.test/create.test.js +0 -84
  273. package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +0 -60
  274. package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +0 -156
  275. package/src/tests/handlers/events/ChangeHandler.test/show.test.js +0 -59
  276. package/src/tests/handlers/events/ClonesHandler.test/create.test.js +0 -57
  277. package/src/tests/handlers/events/DeletesHandler.test/create.test.js +0 -115
  278. package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +0 -60
  279. package/src/tests/handlers/events/EventsAPIHandler.test/index.test.js +0 -39
  280. package/src/tests/handlers/events/EventsHandler.test/create.test.js +0 -172
  281. package/src/tests/handlers/events/EventsHandler.test/show.test.js +0 -120
  282. package/src/tests/handlers/events/EventsHistoryHandler.test/index.test.js +0 -87
  283. package/src/tests/handlers/events/ExportsHandler.test/index.test.js +0 -212
  284. package/src/tests/handlers/events/TranslationHandler.test/create.test.js +0 -303
  285. package/src/tests/handlers/events/TranslationHandler.test/create_form.test.js +0 -71
  286. package/src/tests/handlers/events/TranslationHandler.test/index.test.js +0 -91
  287. package/src/tests/handlers/events/URLsHandler.test/create.test.js +0 -160
  288. package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +0 -55
  289. package/src/tests/handlers/page_revisions/CancelScheduledHandler.test/create.test.js +0 -86
  290. package/src/tests/handlers/page_revisions/CodesHandler.test/update.test.js +0 -204
  291. package/src/tests/handlers/page_revisions/GeneralHandler.test/edit_form.test.js +0 -54
  292. package/src/tests/handlers/page_revisions/GeneralHandler.test/update.test.js +0 -219
  293. package/src/tests/handlers/page_revisions/LocksHandler.test/create.test.js +0 -138
  294. package/src/tests/handlers/page_revisions/LocksHandler.test/create_form.test.js +0 -55
  295. package/src/tests/handlers/page_revisions/MetaHandler.test/update.test.js +0 -211
  296. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/create.test.js +0 -85
  297. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/destroy.test.js +0 -57
  298. package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +0 -333
  299. package/src/tests/handlers/page_revisions/RevertsHandler.test/create.test.js +0 -83
  300. package/src/tests/handlers/page_revisions/TagHandler.test/edit_form.test.js +0 -100
  301. package/src/tests/handlers/page_revisions/TagHandler.test/update.test.js +0 -223
  302. package/src/tests/handlers/page_revisions/UnlocksHandler.test/create.test.js +0 -80
  303. package/src/tests/handlers/page_revisions/VisualHandler.test.test/update.test.js +0 -183
  304. package/src/tests/handlers/page_revisions/WidgetHandler.test/show.test.js +0 -46
  305. package/src/tests/handlers/page_revisions/WidgetHandler.test/update.test.js +0 -103
  306. package/src/tests/handlers/pages/ChangeHandler.test/show.test.js +0 -59
  307. package/src/tests/handlers/pages/ConesHandler.test/create.test.js +0 -57
  308. package/src/tests/handlers/pages/DeletesHandler.test/create.test.js +0 -115
  309. package/src/tests/handlers/pages/DeletesHandler.test/create_form.test.js +0 -60
  310. package/src/tests/handlers/pages/ExportsHandler.test/index.test.js +0 -212
  311. package/src/tests/handlers/pages/PagesAPIHandler.test/index.test.js +0 -39
  312. package/src/tests/handlers/pages/PagesHandler.test/create_form.test.js +0 -41
  313. package/src/tests/handlers/pages/PagesHandler.test/index.test.js +0 -69
  314. package/src/tests/handlers/pages/PagesHandler.test/show.test.js +0 -118
  315. package/src/tests/handlers/pages/PagesHistoryHandler.test/index.test.js +0 -87
  316. package/src/tests/handlers/pages/TranslationHandler.test/create.test.js +0 -290
  317. package/src/tests/handlers/pages/TranslationHandler.test/create_form.test.js +0 -71
  318. package/src/tests/handlers/pages/TranslationHandler.test/index.test.js +0 -87
  319. package/src/tests/handlers/pages/URLsHandler.test/create.test.js +0 -160
  320. package/src/tests/handlers/pages/URLsHandler.test/create_form.test.js +0 -58
@@ -0,0 +1,640 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import ejs from "ejs";
3
+
4
+ import HonoAdapter from "../HonoAdapter";
5
+ import Logger from "../Logger";
6
+ import RaketaContext from "../RaketaContext";
7
+
8
+ jest.mock("node:fs", () => ({
9
+ existsSync: jest.fn(),
10
+ readFileSync: jest.fn(),
11
+ }));
12
+
13
+ jest.mock("ejs", () => ({
14
+ render: jest.fn(),
15
+ renderFile: jest.fn(),
16
+ }));
17
+
18
+ jest.mock("../setupAuthentication", () => jest.fn());
19
+
20
+ jest.mock("../Logger", () => ({
21
+ info: jest.fn(),
22
+ error: jest.fn(),
23
+ }));
24
+
25
+ function makeRouter() {
26
+ return {
27
+ get: jest.fn(),
28
+ post: jest.fn(),
29
+ put: jest.fn(),
30
+ delete: jest.fn(),
31
+ use: jest.fn(),
32
+ header: jest.fn(),
33
+ router: { routes: [] },
34
+ };
35
+ }
36
+
37
+ function makeConfig(overrides = {}) {
38
+ return {
39
+ i18n: {
40
+ locales: { en: { name: "English", code: "en-gb" } },
41
+ defaultLocale: "en",
42
+ timezones: {},
43
+ timeLocale: "en-GB",
44
+ dateTimeFormat: "yyyy-MM-dd HH:mm",
45
+ dateFormat: "yyyy-MM-dd",
46
+ },
47
+ remoteConfig: { foo: "bar" },
48
+ layout: { sidebar: [] },
49
+ helpers: {},
50
+ cloud: { images_api_key: "key" },
51
+ ...overrides,
52
+ };
53
+ }
54
+
55
+ describe("HonoAdapter constructor", () => {
56
+ test("registers / redirect when config provided", () => {
57
+ const router = makeRouter();
58
+ new HonoAdapter(router, makeConfig());
59
+
60
+ expect(router.get).toHaveBeenCalledWith("/", expect.any(Function));
61
+
62
+ const redirectHandler = router.get.mock.calls.find(
63
+ ([path]) => path === "/"
64
+ )[1];
65
+ const c = { redirect: jest.fn().mockReturnValue("redirected") };
66
+ expect(redirectHandler(c)).toBe("redirected");
67
+ expect(c.redirect).toHaveBeenCalledWith("/en");
68
+ });
69
+
70
+ test("does not register / when no config", () => {
71
+ const router = makeRouter();
72
+ new HonoAdapter(router);
73
+
74
+ expect(router.get).not.toHaveBeenCalled();
75
+ });
76
+ });
77
+
78
+ describe("HonoAdapter.getActionPath", () => {
79
+ let adapter;
80
+
81
+ beforeEach(() => {
82
+ adapter = new HonoAdapter(makeRouter());
83
+ existsSync.mockReset();
84
+ });
85
+
86
+ test("returns app path when it exists", () => {
87
+ existsSync.mockReturnValue(true);
88
+
89
+ const result = adapter.getActionPath("pages", "pages", "index");
90
+
91
+ expect(result).toBe(`${process.cwd()}/src/views/pages/index.ejs`);
92
+ });
93
+
94
+ test("returns package path with viewsFallback when app missing", () => {
95
+ existsSync.mockReturnValue(false);
96
+
97
+ const result = adapter.getActionPath("pages", "fallback", "index");
98
+
99
+ expect(result).toContain("/views/fallback/index.ejs");
100
+ });
101
+
102
+ test("returns package path with views when no fallback", () => {
103
+ existsSync.mockReturnValue(false);
104
+
105
+ const result = adapter.getActionPath("pages", null, "index");
106
+
107
+ expect(result).toContain("/views/pages/index.ejs");
108
+ });
109
+ });
110
+
111
+ describe("HonoAdapter.getHelpers", () => {
112
+ test("returns helpers object with all keys", () => {
113
+ const adapter = new HonoAdapter(makeRouter());
114
+ const helpers = adapter.getHelpers({ remoteConfig: {} });
115
+
116
+ expect(helpers).toHaveProperty("t");
117
+ expect(helpers).toHaveProperty("f");
118
+ expect(helpers).toHaveProperty("form_for");
119
+ expect(helpers).toHaveProperty("history");
120
+ expect(helpers).toHaveProperty("utils");
121
+ expect(helpers).toHaveProperty("sort_button");
122
+ expect(helpers).toHaveProperty("pagination");
123
+ expect(helpers).toHaveProperty("Inflector");
124
+ });
125
+ });
126
+
127
+ describe("HonoAdapter.renderPartial", () => {
128
+ let adapter;
129
+
130
+ beforeEach(() => {
131
+ adapter = new HonoAdapter(makeRouter());
132
+ existsSync.mockReset();
133
+ readFileSync.mockReset();
134
+ ejs.render.mockReset();
135
+ Logger.error.mockClear();
136
+ });
137
+
138
+ test("renders partial successfully", () => {
139
+ existsSync.mockReturnValue(true);
140
+ readFileSync.mockReturnValue("<%= foo %>");
141
+ ejs.render.mockReturnValue("rendered");
142
+
143
+ const render = adapter.renderPartial({ foo: "bar" }, "pages", null);
144
+ const result = render("_partial.ejs", { extra: 1 });
145
+
146
+ expect(result).toBe("rendered");
147
+ expect(ejs.render).toHaveBeenCalledWith(
148
+ "<%= foo %>",
149
+ expect.objectContaining({ foo: "bar", extra: 1 }),
150
+ expect.objectContaining({ filename: expect.any(String) })
151
+ );
152
+ });
153
+
154
+ test("returns error markup on render failure", () => {
155
+ existsSync.mockReturnValue(true);
156
+ readFileSync.mockImplementation(() => {
157
+ const err = new Error("boom");
158
+ err.stack = "stack-trace";
159
+ throw err;
160
+ });
161
+
162
+ const render = adapter.renderPartial({}, "pages", null);
163
+ const result = render("_partial.ejs", {});
164
+
165
+ expect(result).toContain("Error rendering");
166
+ expect(result).toContain("stack-trace");
167
+ expect(Logger.error).toHaveBeenCalled();
168
+ });
169
+
170
+ test("throws when partial cannot be located", () => {
171
+ existsSync.mockReturnValue(false);
172
+
173
+ const render = adapter.renderPartial({}, "pages", "fallback");
174
+
175
+ expect(() => render("_missing.ejs", {})).toThrow(/Template not found/);
176
+ });
177
+ });
178
+
179
+ describe("HonoAdapter.renderAction", () => {
180
+ let adapter;
181
+
182
+ beforeEach(() => {
183
+ adapter = new HonoAdapter(makeRouter(), makeConfig());
184
+ existsSync.mockReset();
185
+ readFileSync.mockReset();
186
+ ejs.render.mockReset();
187
+ ejs.renderFile.mockReset();
188
+ Logger.error.mockClear();
189
+ });
190
+
191
+ test("renders action template and layout", async () => {
192
+ existsSync.mockReturnValue(true);
193
+ readFileSync.mockReturnValue("<%= title %>");
194
+ ejs.render.mockReturnValue("<h1>Hi</h1>");
195
+ ejs.renderFile.mockResolvedValue("<html>...</html>");
196
+
197
+ const result = await adapter.renderAction({
198
+ views: "pages",
199
+ viewsFallback: null,
200
+ action: "index",
201
+ assigns: { title: "Hi" },
202
+ });
203
+
204
+ expect(result).toBe("<html>...</html>");
205
+ expect(ejs.render).toHaveBeenCalled();
206
+ expect(ejs.renderFile).toHaveBeenCalled();
207
+ });
208
+
209
+ test("returns error markup when action template missing", async () => {
210
+ existsSync.mockReturnValue(true);
211
+ readFileSync.mockImplementation(() => {
212
+ const err = new Error("nope");
213
+ err.stack = "trace";
214
+ throw err;
215
+ });
216
+
217
+ const result = await adapter.renderAction({
218
+ views: "pages",
219
+ viewsFallback: null,
220
+ action: "index",
221
+ assigns: {},
222
+ });
223
+
224
+ expect(result).toContain("Error rendering");
225
+ expect(result).toContain("trace");
226
+ expect(Logger.error).toHaveBeenCalled();
227
+ });
228
+ });
229
+
230
+ describe("HonoAdapter.renderLayout", () => {
231
+ test("calls ejs.renderFile with merged assigns + body", async () => {
232
+ const adapter = new HonoAdapter(makeRouter());
233
+ ejs.renderFile.mockReset();
234
+ ejs.renderFile.mockResolvedValue("<html>ok</html>");
235
+
236
+ const result = await adapter.renderLayout({ foo: "bar" }, "<p>body</p>");
237
+
238
+ expect(result).toBe("<html>ok</html>");
239
+ expect(ejs.renderFile).toHaveBeenCalledWith(
240
+ expect.stringContaining("/views/layouts/application.ejs"),
241
+ { foo: "bar", body: "<p>body</p>" }
242
+ );
243
+ });
244
+ });
245
+
246
+ describe("HonoAdapter.parseFormBody", () => {
247
+ test("handles deeply nested keys with mixed string + array values", () => {
248
+ const adapter = new HonoAdapter(makeRouter());
249
+
250
+ const result = adapter.parseFormBody({
251
+ "user[name]": "Jane",
252
+ "user[hobbies][]": ["chess", "tennis"],
253
+ });
254
+
255
+ expect(result).toEqual({
256
+ user: { name: "Jane", hobbies: ["chess", "tennis"] },
257
+ });
258
+ });
259
+
260
+ test("wraps single-value [] keys into array", () => {
261
+ const adapter = new HonoAdapter(makeRouter());
262
+
263
+ const result = adapter.parseFormBody({
264
+ "tags[]": "solo",
265
+ });
266
+
267
+ expect(result).toEqual({ tags: ["solo"] });
268
+ });
269
+ });
270
+
271
+ describe("HonoAdapter.formatQuery", () => {
272
+ test("returns empty object for non-object input", () => {
273
+ const adapter = new HonoAdapter(makeRouter());
274
+
275
+ expect(adapter.formatQuery(null)).toEqual({});
276
+ expect(adapter.formatQuery(undefined)).toEqual({});
277
+ });
278
+ });
279
+
280
+ describe("HonoAdapter.createContext", () => {
281
+ function makeRouterCtx({ req: reqOverrides = {}, ...rest } = {}) {
282
+ return {
283
+ req: {
284
+ header: jest.fn().mockReturnValue("application/json"),
285
+ json: jest.fn().mockResolvedValue({ foo: "bar" }),
286
+ text: jest.fn().mockResolvedValue("plain text"),
287
+ parseBody: jest.fn().mockResolvedValue({}),
288
+ routePath: "/en/pages",
289
+ path: "/en/pages",
290
+ url: "http://localhost/en/pages",
291
+ param: jest.fn().mockReturnValue({ id: "42" }),
292
+ queries: jest.fn().mockReturnValue({}),
293
+ ...reqOverrides,
294
+ },
295
+ get: jest.fn().mockReturnValue({ token: "jwt" }),
296
+ ...rest,
297
+ };
298
+ }
299
+
300
+ test("creates RaketaContext for json content type", async () => {
301
+ const adapter = new HonoAdapter(makeRouter(), makeConfig());
302
+ const routerCtx = makeRouterCtx();
303
+
304
+ const ctx = await adapter.createContext(routerCtx, () => {}, "GET", "pages", "index");
305
+
306
+ expect(ctx).toBeInstanceOf(RaketaContext);
307
+ expect(ctx.body).toEqual({ foo: "bar" });
308
+ expect(ctx.action).toBe("index");
309
+ expect(ctx.resource).toBe("pages");
310
+ });
311
+
312
+ test("parses text/plain as text", async () => {
313
+ const adapter = new HonoAdapter(makeRouter(), makeConfig());
314
+ const routerCtx = makeRouterCtx({
315
+ req: {
316
+ header: jest.fn().mockReturnValue("text/plain"),
317
+ },
318
+ });
319
+
320
+ const ctx = await adapter.createContext(routerCtx, () => {}, "GET", "pages", "index");
321
+
322
+ expect(ctx.body).toBe("plain text");
323
+ });
324
+
325
+ test("parses form-urlencoded via parseFormBody", async () => {
326
+ const adapter = new HonoAdapter(makeRouter(), makeConfig());
327
+ const formBody = { "user[name]": "Jane" };
328
+ const routerCtx = makeRouterCtx({
329
+ req: {
330
+ header: jest
331
+ .fn()
332
+ .mockReturnValue("application/x-www-form-urlencoded"),
333
+ parseBody: jest.fn().mockResolvedValue(formBody),
334
+ },
335
+ });
336
+
337
+ const ctx = await adapter.createContext(routerCtx, () => {}, "POST", "pages", "create");
338
+
339
+ expect(ctx.resourceParams).toEqual({ user: { name: "Jane" } });
340
+ });
341
+
342
+ test("defaults to parseBody when no content-type header", async () => {
343
+ const adapter = new HonoAdapter(makeRouter(), makeConfig());
344
+ const routerCtx = makeRouterCtx({
345
+ req: {
346
+ header: jest.fn().mockReturnValue(undefined),
347
+ parseBody: jest.fn().mockResolvedValue({ raw: "data" }),
348
+ },
349
+ });
350
+
351
+ const ctx = await adapter.createContext(routerCtx, () => {}, "POST", "pages", "create");
352
+
353
+ expect(ctx.body).toEqual({ raw: "data" });
354
+ });
355
+ });
356
+
357
+ describe("HonoAdapter.createAction", () => {
358
+ function makeRouterCtx(overrides = {}) {
359
+ return {
360
+ req: {
361
+ header: jest.fn().mockReturnValue("application/json"),
362
+ json: jest.fn().mockResolvedValue({}),
363
+ text: jest.fn().mockResolvedValue(""),
364
+ parseBody: jest.fn().mockResolvedValue({}),
365
+ routePath: "/en/pages",
366
+ path: "/en/pages",
367
+ url: "http://localhost/en/pages",
368
+ param: jest.fn().mockReturnValue({}),
369
+ queries: jest.fn().mockReturnValue({}),
370
+ },
371
+ get: jest.fn().mockReturnValue({ token: "jwt" }),
372
+ redirect: jest.fn().mockReturnValue("redirected"),
373
+ json: jest.fn().mockReturnValue("jsoned"),
374
+ text: jest.fn().mockReturnValue("texted"),
375
+ html: jest.fn().mockReturnValue("htmled"),
376
+ header: jest.fn(),
377
+ ...overrides,
378
+ };
379
+ }
380
+
381
+ function getRegisteredHandler(adapter, path) {
382
+ return adapter.localRouter.find((r) => r.path === path)?.handler;
383
+ }
384
+
385
+ beforeEach(() => {
386
+ existsSync.mockReturnValue(true);
387
+ readFileSync.mockReturnValue("<%= title %>");
388
+ ejs.render.mockReturnValue("<h1>Hi</h1>");
389
+ ejs.renderFile.mockResolvedValue("<html>ok</html>");
390
+ });
391
+
392
+ test("registers a route per locale and renders html for assigns result", async () => {
393
+ const router = makeRouter();
394
+ const adapter = new HonoAdapter(router, makeConfig());
395
+ const handler = jest.fn().mockResolvedValue({ assigns: { title: "Hi" } });
396
+
397
+ await adapter.createAction(
398
+ ["GET", "/pages", "pages", "pages", "index", handler],
399
+ { viewsFallback: "pages" }
400
+ );
401
+
402
+ const registered = getRegisteredHandler(adapter, "/en/pages");
403
+ expect(registered).toBeDefined();
404
+
405
+ const routerCtx = makeRouterCtx();
406
+ const result = await registered(routerCtx, () => {});
407
+
408
+ expect(handler).toHaveBeenCalled();
409
+ expect(routerCtx.html).toHaveBeenCalled();
410
+ expect(result).toBe("htmled");
411
+ });
412
+
413
+ test("returns redirect when handler resolves with redirect", async () => {
414
+ const router = makeRouter();
415
+ const adapter = new HonoAdapter(router, makeConfig());
416
+ const handler = jest.fn().mockResolvedValue({ redirect: "/en/pages/1" });
417
+
418
+ await adapter.createAction(
419
+ ["POST", "/pages", "pages", "pages", "create_form", handler],
420
+ {}
421
+ );
422
+
423
+ const registered = getRegisteredHandler(adapter, "/en/pages");
424
+ const routerCtx = makeRouterCtx();
425
+
426
+ await registered(routerCtx, () => {});
427
+
428
+ expect(routerCtx.redirect).toHaveBeenCalledWith("/en/pages/1");
429
+ });
430
+
431
+ test("returns json when handler resolves with json", async () => {
432
+ const router = makeRouter();
433
+ const adapter = new HonoAdapter(router, makeConfig());
434
+ const handler = jest.fn().mockResolvedValue({ json: { ok: true } });
435
+
436
+ await adapter.createAction(
437
+ ["GET", "/api/pages", "pages", "pages", "index", handler],
438
+ {}
439
+ );
440
+
441
+ const registered = getRegisteredHandler(adapter, "/en/api/pages");
442
+ const routerCtx = makeRouterCtx();
443
+
444
+ await registered(routerCtx, () => {});
445
+
446
+ expect(routerCtx.json).toHaveBeenCalledWith({ ok: true });
447
+ });
448
+
449
+ test("returns text when handler resolves with text", async () => {
450
+ const router = makeRouter();
451
+ const adapter = new HonoAdapter(router, makeConfig());
452
+ const handler = jest.fn().mockResolvedValue({ text: "csv,data" });
453
+
454
+ await adapter.createAction(
455
+ ["GET", "/exports", "pages", "pages", "index", handler],
456
+ {}
457
+ );
458
+
459
+ const registered = getRegisteredHandler(adapter, "/en/exports");
460
+ const routerCtx = makeRouterCtx();
461
+
462
+ await registered(routerCtx, () => {});
463
+
464
+ expect(routerCtx.text).toHaveBeenCalledWith("csv,data");
465
+ });
466
+
467
+ test("applies headers from handler result", async () => {
468
+ const router = makeRouter();
469
+ const adapter = new HonoAdapter(router, makeConfig());
470
+ const handler = jest
471
+ .fn()
472
+ .mockResolvedValue({ headers: { "X-Test": "1" }, json: {} });
473
+
474
+ await adapter.createAction(
475
+ ["GET", "/pages", "pages", "pages", "index", handler],
476
+ {}
477
+ );
478
+
479
+ const registered = getRegisteredHandler(adapter, "/en/pages");
480
+ const routerCtx = makeRouterCtx();
481
+
482
+ await registered(routerCtx, () => {});
483
+
484
+ expect(routerCtx.header).toHaveBeenCalledWith("X-Test", "1");
485
+ });
486
+
487
+ test("runs beforeFilter and merges assigns when pattern matches", async () => {
488
+ const router = makeRouter();
489
+ const adapter = new HonoAdapter(router, makeConfig());
490
+ adapter.setBeforeFilter(/\/pages/, () => ({ assigns: { before: "yes" } }));
491
+ const handler = jest.fn().mockResolvedValue({ assigns: {} });
492
+
493
+ await adapter.createAction(
494
+ ["GET", "/pages", "pages", "pages", "index", handler],
495
+ {}
496
+ );
497
+
498
+ const registered = getRegisteredHandler(adapter, "/en/pages");
499
+ const routerCtx = makeRouterCtx();
500
+
501
+ await registered(routerCtx, () => {});
502
+
503
+ expect(handler).toHaveBeenCalled();
504
+ expect(routerCtx.html).toHaveBeenCalled();
505
+ });
506
+
507
+ test("beforeFilter can short-circuit with redirect", async () => {
508
+ const router = makeRouter();
509
+ const adapter = new HonoAdapter(router, makeConfig());
510
+ adapter.setBeforeFilter(/\/pages/, () => ({ redirect: "/login" }));
511
+ const handler = jest.fn();
512
+
513
+ await adapter.createAction(
514
+ ["GET", "/pages", "pages", "pages", "index", handler],
515
+ {}
516
+ );
517
+
518
+ const registered = getRegisteredHandler(adapter, "/en/pages");
519
+ const routerCtx = makeRouterCtx();
520
+
521
+ await registered(routerCtx, () => {});
522
+
523
+ expect(routerCtx.redirect).toHaveBeenCalledWith("/login");
524
+ expect(handler).not.toHaveBeenCalled();
525
+ });
526
+
527
+ test("beforeFilter can short-circuit with json", async () => {
528
+ const router = makeRouter();
529
+ const adapter = new HonoAdapter(router, makeConfig());
530
+ adapter.setBeforeFilter(/\/pages/, () => ({ json: { denied: true } }));
531
+ const handler = jest.fn();
532
+
533
+ await adapter.createAction(
534
+ ["GET", "/pages", "pages", "pages", "index", handler],
535
+ {}
536
+ );
537
+
538
+ const registered = getRegisteredHandler(adapter, "/en/pages");
539
+ const routerCtx = makeRouterCtx();
540
+
541
+ await registered(routerCtx, () => {});
542
+
543
+ expect(routerCtx.json).toHaveBeenCalledWith({ denied: true });
544
+ expect(handler).not.toHaveBeenCalled();
545
+ });
546
+
547
+ test("afterFilter can short-circuit with redirect", async () => {
548
+ const router = makeRouter();
549
+ const adapter = new HonoAdapter(router, makeConfig());
550
+ adapter.setAfterFilter(/\/pages/, () => ({ redirect: "/after" }));
551
+ const handler = jest.fn().mockResolvedValue({ assigns: {} });
552
+
553
+ await adapter.createAction(
554
+ ["GET", "/pages", "pages", "pages", "index", handler],
555
+ {}
556
+ );
557
+
558
+ const registered = getRegisteredHandler(adapter, "/en/pages");
559
+ const routerCtx = makeRouterCtx();
560
+
561
+ await registered(routerCtx, () => {});
562
+
563
+ expect(routerCtx.redirect).toHaveBeenCalledWith("/after");
564
+ });
565
+
566
+ test("afterFilter can short-circuit with json + text + merges assigns", async () => {
567
+ const router = makeRouter();
568
+ const adapter = new HonoAdapter(router, makeConfig());
569
+ adapter.setAfterFilter(/\/pages/, () => ({ json: { after: true } }));
570
+ const handler = jest.fn().mockResolvedValue({ assigns: {} });
571
+
572
+ await adapter.createAction(
573
+ ["GET", "/pages", "pages", "pages", "index", handler],
574
+ {}
575
+ );
576
+
577
+ const registered = getRegisteredHandler(adapter, "/en/pages");
578
+ const routerCtx = makeRouterCtx();
579
+
580
+ await registered(routerCtx, () => {});
581
+
582
+ expect(routerCtx.json).toHaveBeenCalledWith({ after: true });
583
+ });
584
+
585
+ test("afterFilter merges assigns when no short-circuit", async () => {
586
+ const router = makeRouter();
587
+ const adapter = new HonoAdapter(router, makeConfig());
588
+ adapter.setAfterFilter(/\/pages/, () => ({ assigns: { after: "yes" } }));
589
+ const handler = jest.fn().mockResolvedValue({ assigns: { foo: "bar" } });
590
+
591
+ await adapter.createAction(
592
+ ["GET", "/pages", "pages", "pages", "index", handler],
593
+ {}
594
+ );
595
+
596
+ const registered = getRegisteredHandler(adapter, "/en/pages");
597
+ const routerCtx = makeRouterCtx();
598
+
599
+ await registered(routerCtx, () => {});
600
+
601
+ expect(routerCtx.html).toHaveBeenCalled();
602
+ });
603
+
604
+ test("handler returning nullish defaults to empty result + renders html", async () => {
605
+ const router = makeRouter();
606
+ const adapter = new HonoAdapter(router, makeConfig());
607
+ const handler = jest.fn().mockResolvedValue(undefined);
608
+
609
+ await adapter.createAction(
610
+ ["GET", "/pages", "pages", "pages", "index", handler],
611
+ {}
612
+ );
613
+
614
+ const registered = getRegisteredHandler(adapter, "/en/pages");
615
+ const routerCtx = makeRouterCtx();
616
+
617
+ await registered(routerCtx, () => {});
618
+
619
+ expect(routerCtx.html).toHaveBeenCalled();
620
+ });
621
+ });
622
+
623
+ describe("HonoAdapter.routeCollection (instance)", () => {
624
+ test("creates an action per mapping entry", async () => {
625
+ const adapter = new HonoAdapter(makeRouter(), makeConfig());
626
+ const createSpy = jest.spyOn(adapter, "createAction").mockResolvedValue();
627
+
628
+ const handler = () => {};
629
+ const mapping = [
630
+ ["GET", "/a", "a", "a", "index", handler],
631
+ ["POST", "/a", "a", "a", "create", handler],
632
+ ];
633
+
634
+ adapter.routeCollection(mapping, { viewsFallback: "a" });
635
+
636
+ expect(createSpy).toHaveBeenCalledTimes(2);
637
+ expect(createSpy).toHaveBeenCalledWith(mapping[0], { viewsFallback: "a" });
638
+ expect(createSpy).toHaveBeenCalledWith(mapping[1], { viewsFallback: "a" });
639
+ });
640
+ });
@@ -151,6 +151,9 @@ describe("HonoAdapter", () => {
151
151
  cloud: {
152
152
  images_api_key: "api-key",
153
153
  },
154
+ remoteConfig: {
155
+ remoteLogin: "",
156
+ },
154
157
  },
155
158
  },
156
159
  },