@raketa-cloud/admin 1.8.4 → 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 (314) hide show
  1. package/package.json +1 -1
  2. package/src/cloud/ResourceChanges.js +41 -0
  3. package/src/cloud/ResourceRevisions.js +242 -0
  4. package/src/cloud/Resources.js +219 -0
  5. package/src/cloud/documents/common.js +0 -30
  6. package/src/cloud/documents/resourcesDocuments.js +371 -0
  7. package/src/handlers/_shared/getResourceUpdateDestination.js +11 -0
  8. package/src/handlers/resource_revisions/CancelSchedulesHandler.js +31 -0
  9. package/src/handlers/resource_revisions/CodeHandler.js +70 -0
  10. package/src/handlers/resource_revisions/GeneralHandler.js +72 -0
  11. package/src/handlers/{article_revisions → resource_revisions}/LocksHandler.js +15 -10
  12. package/src/handlers/resource_revisions/MetaHandler.js +70 -0
  13. package/src/handlers/{article_revisions → resource_revisions}/PublishesHandler.js +27 -19
  14. package/src/handlers/resource_revisions/ResourceRevisionsHandler.js +65 -0
  15. package/src/handlers/{article_revisions → resource_revisions}/RevertsHandler.js +7 -5
  16. package/src/handlers/{page_revisions → resource_revisions}/TagHandler.js +31 -16
  17. package/src/handlers/resource_revisions/UnlocksHandler.js +29 -0
  18. package/src/handlers/resource_revisions/VisualHandler.js +71 -0
  19. package/src/handlers/{article_revisions → resource_revisions}/WidgetHandler.js +11 -6
  20. package/src/handlers/{pages → resources}/ChangeHandler.js +5 -3
  21. package/src/handlers/resources/ClonesHandler.js +24 -0
  22. package/src/handlers/resources/DeletesHandler.js +79 -0
  23. package/src/handlers/{pages → resources}/ExportsHandler.js +8 -4
  24. package/src/handlers/resources/HistoryHandler.js +39 -0
  25. package/src/handlers/{pages/PagesAPIHandler.js → resources/ResourcesAPIHandler.js} +4 -2
  26. package/src/handlers/{pages/PagesHandler.js → resources/ResourcesHandler.js} +35 -18
  27. package/src/handlers/{pages → resources}/TranslationsHandler.js +65 -37
  28. package/src/handlers/resources/URLsHandler.js +84 -0
  29. package/src/helpers/CSVExportHelper.js +5 -6
  30. package/src/index.js +28 -69
  31. package/src/routeArticlesModule.js +7 -167
  32. package/src/routeEventsModule.js +7 -182
  33. package/src/routePagesModule.js +7 -179
  34. package/src/routeResource.js +197 -0
  35. package/src/routeStandard.js +1 -1
  36. package/src/setupCloud.js +10 -30
  37. package/src/tests/HonoAdapter.coverage.test.js +640 -0
  38. package/src/tests/buildResourcePath.test.js +69 -0
  39. package/src/tests/handlers/_shared/getResourceUpdateDestination.test.js +63 -0
  40. package/src/tests/handlers/{article_revisions/CancelScheduledHandler.test → resource_revisions/CancelSchedulesHandler.test}/create.test.js +26 -26
  41. package/src/tests/handlers/{page_revisions/CodesHandler.test → resource_revisions/CodeHandler.test}/edit_form.test.js +13 -16
  42. package/src/tests/handlers/{article_revisions/CodesHandler.test → resource_revisions/CodeHandler.test}/update.test.js +38 -57
  43. package/src/tests/handlers/resource_revisions/GeneralHandler.test/edit_form.test.js +58 -0
  44. package/src/tests/handlers/{article_revisions → resource_revisions}/GeneralHandler.test/update.test.js +39 -53
  45. package/src/tests/handlers/{event_revisions → resource_revisions}/LocksHandler.test/create.test.js +34 -31
  46. package/src/tests/handlers/{event_revisions → resource_revisions}/LocksHandler.test/create_form.test.js +16 -12
  47. package/src/tests/handlers/{page_revisions → resource_revisions}/MetaHandler.test/edit_form.test.js +13 -9
  48. package/src/tests/handlers/{article_revisions → resource_revisions}/MetaHandler.test/update.test.js +38 -57
  49. package/src/tests/handlers/{article_revisions → resource_revisions}/PublishesHandler.test/create.test.js +60 -72
  50. package/src/tests/handlers/{page_revisions → resource_revisions}/PublishesHandler.test/create_form.test.js +14 -10
  51. package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/create.test.js +87 -0
  52. package/src/tests/handlers/{article_revisions/ArticleRevisionsHandler.test → resource_revisions/ResourceRevisionsHandler.test}/destroy.test.js +13 -13
  53. package/src/tests/handlers/resource_revisions/RevertsHandler.test/create.test.js +83 -0
  54. package/src/tests/handlers/{event_revisions → resource_revisions}/TagHandler.test/edit_form.test.js +23 -19
  55. package/src/tests/handlers/{article_revisions → resource_revisions}/TagHandler.test/update.test.js +44 -49
  56. package/src/tests/handlers/{article_revisions → resource_revisions}/UnlocksHandler.test/create.test.js +22 -22
  57. package/src/tests/handlers/{page_revisions/VisualHandler.test.test → resource_revisions/VisualHandler.test}/edit_form.test.js +13 -16
  58. package/src/tests/handlers/resource_revisions/VisualHandler.test/update.test.js +130 -0
  59. package/src/tests/handlers/{event_revisions → resource_revisions}/WidgetHandler.test/show.test.js +11 -7
  60. package/src/tests/handlers/{event_revisions → resource_revisions}/WidgetHandler.test/update.test.js +28 -14
  61. package/src/tests/handlers/resources/ChangeHandler.test/show.test.js +57 -0
  62. package/src/tests/handlers/resources/ClonesHandler.test/create.test.js +57 -0
  63. package/src/tests/handlers/{articles → resources}/DeletesHandler.test/create.test.js +30 -30
  64. package/src/tests/handlers/resources/DeletesHandler.test/create_form.test.js +60 -0
  65. package/src/tests/handlers/{articles → resources}/ExportsHandler.test/index.test.js +57 -57
  66. package/src/tests/handlers/{articles/ArticlesHistoryHandler.test → resources/HistoryHandler.test}/index.test.js +19 -20
  67. package/src/tests/handlers/resources/ResourcesAPIHandler.test/index.test.js +41 -0
  68. package/src/tests/handlers/{pages/PagesHandler.test → resources/ResourcesHandler.test}/create.test.js +23 -22
  69. package/src/tests/handlers/{events/EventsHandler.test → resources/ResourcesHandler.test}/create_form.test.js +12 -11
  70. package/src/tests/handlers/{events/EventsHandler.test → resources/ResourcesHandler.test}/index.test.js +18 -18
  71. package/src/tests/handlers/resources/ResourcesHandler.test/show.test.js +111 -0
  72. package/src/tests/handlers/resources/TranslationsHandler.test/create.test.js +320 -0
  73. package/src/tests/handlers/resources/TranslationsHandler.test/create_form.test.js +85 -0
  74. package/src/tests/handlers/resources/TranslationsHandler.test/index.test.js +99 -0
  75. package/src/tests/handlers/{articles → resources}/URLsHandler.test/create.test.js +48 -43
  76. package/src/tests/handlers/resources/URLsHandler.test/create_form.test.js +55 -0
  77. package/src/tests/routeArticlesModule.test.js +43 -0
  78. package/src/tests/routeCategoriesModule.test.js +23 -0
  79. package/src/tests/routeEventsModule.test.js +43 -0
  80. package/src/tests/routePagesModule.test.js +43 -0
  81. package/src/tests/routeResource.test.js +202 -0
  82. package/src/tests/routeSettings.test.js +40 -0
  83. package/src/tests/routeStandard.test.js +70 -0
  84. package/src/tests/setGlobalContext.test.js +12 -0
  85. package/src/tests/setupAuthentication.test.js +407 -0
  86. package/src/tests/setupCloud.test.js +51 -0
  87. package/src/tests/support/factory.js +15 -86
  88. package/src/views/article_revisions/_nav.ejs +6 -6
  89. package/src/views/article_revisions/codes/_form.ejs +2 -2
  90. package/src/views/article_revisions/general/_form.ejs +3 -3
  91. package/src/views/article_revisions/locks/_form.ejs +2 -2
  92. package/src/views/article_revisions/meta/_form.ejs +2 -2
  93. package/src/views/article_revisions/publishes/_form.ejs +2 -2
  94. package/src/views/article_revisions/tags/_form.ejs +2 -2
  95. package/src/views/article_revisions/visuals/_form.ejs +2 -2
  96. package/src/views/articles/_form.ejs +9 -9
  97. package/src/views/articles/_shared/_export_button.ejs +1 -1
  98. package/src/views/articles/_shared/_history_toolbar.ejs +2 -2
  99. package/src/views/articles/_shared/_revision_toolbar.ejs +7 -7
  100. package/src/views/articles/_shared/_title.ejs +2 -2
  101. package/src/views/articles/_shared/_toolbar.ejs +6 -6
  102. package/src/views/articles/_shared/history_table.ejs +1 -1
  103. package/src/views/articles/create_form.ejs +1 -1
  104. package/src/views/articles/deletes/create_form.ejs +3 -3
  105. package/src/views/articles/history/index.ejs +4 -4
  106. package/src/views/articles/index.ejs +11 -11
  107. package/src/views/articles/show.ejs +6 -6
  108. package/src/views/articles/translations/_translation_toolbar.ejs +2 -2
  109. package/src/views/articles/translations/create_form.ejs +2 -2
  110. package/src/views/articles/translations/index.ejs +3 -3
  111. package/src/views/articles/urls/create_form.ejs +3 -3
  112. package/src/views/event_revisions/_nav.ejs +6 -6
  113. package/src/views/event_revisions/codes/_form.ejs +2 -2
  114. package/src/views/event_revisions/general/_form.ejs +5 -5
  115. package/src/views/event_revisions/locks/_form.ejs +2 -2
  116. package/src/views/event_revisions/meta/_form.ejs +2 -2
  117. package/src/views/event_revisions/publishes/_form.ejs +2 -2
  118. package/src/views/event_revisions/tags/_form.ejs +2 -2
  119. package/src/views/event_revisions/visuals/_form.ejs +2 -2
  120. package/src/views/events/_form.ejs +6 -6
  121. package/src/views/events/_shared/_export_button.ejs +1 -1
  122. package/src/views/events/_shared/_history_toolbar.ejs +2 -2
  123. package/src/views/events/_shared/_revision_toolbar.ejs +7 -7
  124. package/src/views/events/_shared/_title.ejs +2 -2
  125. package/src/views/events/_shared/_toolbar.ejs +6 -6
  126. package/src/views/events/_shared/history_table.ejs +1 -1
  127. package/src/views/events/create_form.ejs +1 -1
  128. package/src/views/events/deletes/create_form.ejs +3 -3
  129. package/src/views/events/history/index.ejs +4 -4
  130. package/src/views/events/index.ejs +11 -11
  131. package/src/views/events/show.ejs +6 -6
  132. package/src/views/events/translations/_translation_toolbar.ejs +2 -2
  133. package/src/views/events/translations/create_form.ejs +2 -2
  134. package/src/views/events/translations/index.ejs +3 -3
  135. package/src/views/events/urls/create_form.ejs +3 -3
  136. package/src/views/page_revisions/_nav.ejs +6 -6
  137. package/src/views/page_revisions/codes/_form.ejs +2 -2
  138. package/src/views/page_revisions/general/_form.ejs +2 -2
  139. package/src/views/page_revisions/locks/_form.ejs +2 -2
  140. package/src/views/page_revisions/meta/_form.ejs +2 -2
  141. package/src/views/page_revisions/publishes/_form.ejs +2 -2
  142. package/src/views/page_revisions/tags/_form.ejs +2 -2
  143. package/src/views/page_revisions/visuals/_form.ejs +2 -2
  144. package/src/views/pages/_form.ejs +3 -3
  145. package/src/views/pages/_shared/_export_button.ejs +1 -1
  146. package/src/views/pages/_shared/_history_toolbar.ejs +2 -2
  147. package/src/views/pages/_shared/_revision_toolbar.ejs +7 -7
  148. package/src/views/pages/_shared/_title.ejs +2 -2
  149. package/src/views/pages/_shared/_toolbar.ejs +6 -6
  150. package/src/views/pages/_shared/history_table.ejs +1 -1
  151. package/src/views/pages/create_form.ejs +1 -1
  152. package/src/views/pages/deletes/create_form.ejs +3 -3
  153. package/src/views/pages/history/index.ejs +4 -4
  154. package/src/views/pages/index.ejs +9 -9
  155. package/src/views/pages/show.ejs +6 -6
  156. package/src/views/pages/translations/_translation_toolbar.ejs +2 -2
  157. package/src/views/pages/translations/create_form.ejs +2 -2
  158. package/src/views/pages/translations/index.ejs +3 -3
  159. package/src/views/pages/urls/create_form.ejs +3 -3
  160. package/src/cloud/ArticleChanges.js +0 -36
  161. package/src/cloud/ArticleRevisions.js +0 -239
  162. package/src/cloud/Articles.js +0 -216
  163. package/src/cloud/EventChanges.js +0 -36
  164. package/src/cloud/EventRevisions.js +0 -246
  165. package/src/cloud/Events.js +0 -231
  166. package/src/cloud/PageChanges.js +0 -36
  167. package/src/cloud/PageRevisions.js +0 -226
  168. package/src/cloud/Pages.js +0 -204
  169. package/src/cloud/documents/articlesDocuments.js +0 -375
  170. package/src/cloud/documents/eventsDocuments.js +0 -390
  171. package/src/cloud/documents/pagesDocuments.js +0 -370
  172. package/src/handlers/_shared/getArticlesUpdateDestination.js +0 -7
  173. package/src/handlers/_shared/getEventsUpdateDestination.js +0 -7
  174. package/src/handlers/_shared/getPagesUpdateDestination.js +0 -8
  175. package/src/handlers/article_revisions/ArticleRevisionsHandler.js +0 -57
  176. package/src/handlers/article_revisions/CancelSchedulesHandler.js +0 -26
  177. package/src/handlers/article_revisions/CodeHandler.js +0 -75
  178. package/src/handlers/article_revisions/GeneralHandler.js +0 -77
  179. package/src/handlers/article_revisions/MetaHandler.js +0 -75
  180. package/src/handlers/article_revisions/TagHandler.js +0 -83
  181. package/src/handlers/article_revisions/UnlocksHandler.js +0 -24
  182. package/src/handlers/article_revisions/VisualHandler.js +0 -75
  183. package/src/handlers/articles/ArticlesAPIHandler.js +0 -15
  184. package/src/handlers/articles/ArticlesHandler.js +0 -126
  185. package/src/handlers/articles/ChangeHandler.js +0 -22
  186. package/src/handlers/articles/ClonesHandler.js +0 -19
  187. package/src/handlers/articles/DeletesHandler.js +0 -72
  188. package/src/handlers/articles/ExportsHandler.js +0 -35
  189. package/src/handlers/articles/HistoryHandler.js +0 -31
  190. package/src/handlers/articles/TranslationsHandler.js +0 -231
  191. package/src/handlers/articles/URLsHandler.js +0 -83
  192. package/src/handlers/event_revisions/CancelSchedulesHandler.js +0 -26
  193. package/src/handlers/event_revisions/CodeHandler.js +0 -73
  194. package/src/handlers/event_revisions/EventRevisionsHandler.js +0 -55
  195. package/src/handlers/event_revisions/GeneralHandler.js +0 -75
  196. package/src/handlers/event_revisions/LocksHandler.js +0 -65
  197. package/src/handlers/event_revisions/MetaHandler.js +0 -73
  198. package/src/handlers/event_revisions/PublishesHandler.js +0 -112
  199. package/src/handlers/event_revisions/RevertsHandler.js +0 -26
  200. package/src/handlers/event_revisions/TagHandler.js +0 -80
  201. package/src/handlers/event_revisions/UnlocksHandler.js +0 -24
  202. package/src/handlers/event_revisions/VisualHandler.js +0 -73
  203. package/src/handlers/event_revisions/WidgetHandler.js +0 -41
  204. package/src/handlers/events/ChangeHandler.js +0 -22
  205. package/src/handlers/events/ClonesHandler.js +0 -19
  206. package/src/handlers/events/DeletesHandler.js +0 -72
  207. package/src/handlers/events/EventsAPIHandler.js +0 -15
  208. package/src/handlers/events/EventsHandler.js +0 -128
  209. package/src/handlers/events/ExportsHandler.js +0 -35
  210. package/src/handlers/events/HistoryHandler.js +0 -31
  211. package/src/handlers/events/TranslationsHandler.js +0 -233
  212. package/src/handlers/events/URLsHandler.js +0 -81
  213. package/src/handlers/page_revisions/CancelSchedulesHandler.js +0 -26
  214. package/src/handlers/page_revisions/CodeHandler.js +0 -59
  215. package/src/handlers/page_revisions/GeneralHandler.js +0 -61
  216. package/src/handlers/page_revisions/LocksHandler.js +0 -69
  217. package/src/handlers/page_revisions/MetaHandler.js +0 -59
  218. package/src/handlers/page_revisions/PageRevisionsHandler.js +0 -55
  219. package/src/handlers/page_revisions/PublishesHandler.js +0 -112
  220. package/src/handlers/page_revisions/RevertsHandler.js +0 -26
  221. package/src/handlers/page_revisions/UnlocksHandler.js +0 -22
  222. package/src/handlers/page_revisions/VisualHandler.js +0 -60
  223. package/src/handlers/page_revisions/WidgetHandler.js +0 -41
  224. package/src/handlers/pages/ClonesHandler.js +0 -19
  225. package/src/handlers/pages/DeletesHandler.js +0 -68
  226. package/src/handlers/pages/HistoryHandler.js +0 -31
  227. package/src/handlers/pages/URLsHandler.js +0 -77
  228. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/create.test.js +0 -87
  229. package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +0 -56
  230. package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +0 -59
  231. package/src/tests/handlers/article_revisions/LocksHandler.test/create.test.js +0 -142
  232. package/src/tests/handlers/article_revisions/LocksHandler.test/create_form.test.js +0 -55
  233. package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +0 -56
  234. package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +0 -48
  235. package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +0 -86
  236. package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +0 -72
  237. package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +0 -56
  238. package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +0 -146
  239. package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +0 -46
  240. package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +0 -103
  241. package/src/tests/handlers/articles/ArticlesAPIHandler.test/index.test.js +0 -43
  242. package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +0 -172
  243. package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +0 -44
  244. package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +0 -73
  245. package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +0 -120
  246. package/src/tests/handlers/articles/ChangeHandler.test/show.test.js +0 -59
  247. package/src/tests/handlers/articles/ClonesHandler.test/create.test.js +0 -57
  248. package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +0 -60
  249. package/src/tests/handlers/articles/TranslationHandler.test/create.test.js +0 -297
  250. package/src/tests/handlers/articles/TranslationHandler.test/create_form.test.js +0 -71
  251. package/src/tests/handlers/articles/TranslationHandler.test/index.test.js +0 -91
  252. package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +0 -55
  253. package/src/tests/handlers/event_revisions/CancelScheduledHandler.test/create.test.js +0 -90
  254. package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +0 -60
  255. package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +0 -171
  256. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/create.test.js +0 -87
  257. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/destroy.test.js +0 -57
  258. package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +0 -63
  259. package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +0 -172
  260. package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +0 -60
  261. package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +0 -173
  262. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +0 -333
  263. package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +0 -48
  264. package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +0 -83
  265. package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +0 -163
  266. package/src/tests/handlers/event_revisions/UnlocksHandler.test/create.test.js +0 -84
  267. package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +0 -60
  268. package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +0 -156
  269. package/src/tests/handlers/events/ChangeHandler.test/show.test.js +0 -59
  270. package/src/tests/handlers/events/ClonesHandler.test/create.test.js +0 -57
  271. package/src/tests/handlers/events/DeletesHandler.test/create.test.js +0 -115
  272. package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +0 -60
  273. package/src/tests/handlers/events/EventsAPIHandler.test/index.test.js +0 -39
  274. package/src/tests/handlers/events/EventsHandler.test/create.test.js +0 -172
  275. package/src/tests/handlers/events/EventsHandler.test/show.test.js +0 -120
  276. package/src/tests/handlers/events/EventsHistoryHandler.test/index.test.js +0 -87
  277. package/src/tests/handlers/events/ExportsHandler.test/index.test.js +0 -212
  278. package/src/tests/handlers/events/TranslationHandler.test/create.test.js +0 -303
  279. package/src/tests/handlers/events/TranslationHandler.test/create_form.test.js +0 -71
  280. package/src/tests/handlers/events/TranslationHandler.test/index.test.js +0 -91
  281. package/src/tests/handlers/events/URLsHandler.test/create.test.js +0 -160
  282. package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +0 -55
  283. package/src/tests/handlers/page_revisions/CancelScheduledHandler.test/create.test.js +0 -86
  284. package/src/tests/handlers/page_revisions/CodesHandler.test/update.test.js +0 -204
  285. package/src/tests/handlers/page_revisions/GeneralHandler.test/edit_form.test.js +0 -54
  286. package/src/tests/handlers/page_revisions/GeneralHandler.test/update.test.js +0 -219
  287. package/src/tests/handlers/page_revisions/LocksHandler.test/create.test.js +0 -138
  288. package/src/tests/handlers/page_revisions/LocksHandler.test/create_form.test.js +0 -55
  289. package/src/tests/handlers/page_revisions/MetaHandler.test/update.test.js +0 -211
  290. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/create.test.js +0 -85
  291. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/destroy.test.js +0 -57
  292. package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +0 -333
  293. package/src/tests/handlers/page_revisions/RevertsHandler.test/create.test.js +0 -83
  294. package/src/tests/handlers/page_revisions/TagHandler.test/edit_form.test.js +0 -100
  295. package/src/tests/handlers/page_revisions/TagHandler.test/update.test.js +0 -223
  296. package/src/tests/handlers/page_revisions/UnlocksHandler.test/create.test.js +0 -80
  297. package/src/tests/handlers/page_revisions/VisualHandler.test.test/update.test.js +0 -183
  298. package/src/tests/handlers/page_revisions/WidgetHandler.test/show.test.js +0 -46
  299. package/src/tests/handlers/page_revisions/WidgetHandler.test/update.test.js +0 -103
  300. package/src/tests/handlers/pages/ChangeHandler.test/show.test.js +0 -59
  301. package/src/tests/handlers/pages/ConesHandler.test/create.test.js +0 -57
  302. package/src/tests/handlers/pages/DeletesHandler.test/create.test.js +0 -115
  303. package/src/tests/handlers/pages/DeletesHandler.test/create_form.test.js +0 -60
  304. package/src/tests/handlers/pages/ExportsHandler.test/index.test.js +0 -212
  305. package/src/tests/handlers/pages/PagesAPIHandler.test/index.test.js +0 -39
  306. package/src/tests/handlers/pages/PagesHandler.test/create_form.test.js +0 -41
  307. package/src/tests/handlers/pages/PagesHandler.test/index.test.js +0 -69
  308. package/src/tests/handlers/pages/PagesHandler.test/show.test.js +0 -118
  309. package/src/tests/handlers/pages/PagesHistoryHandler.test/index.test.js +0 -87
  310. package/src/tests/handlers/pages/TranslationHandler.test/create.test.js +0 -290
  311. package/src/tests/handlers/pages/TranslationHandler.test/create_form.test.js +0 -71
  312. package/src/tests/handlers/pages/TranslationHandler.test/index.test.js +0 -87
  313. package/src/tests/handlers/pages/URLsHandler.test/create.test.js +0 -160
  314. 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
+ });
@@ -0,0 +1,69 @@
1
+ import buildResourcePath from "../buildResourcePath";
2
+
3
+ describe("buildResourcePath", () => {
4
+ const prefix_map = {
5
+ page: "/",
6
+ article: "/blog",
7
+ event: "/events",
8
+ };
9
+
10
+ test("strips locale when locale matches defaultLocale", () => {
11
+ const result = buildResourcePath({
12
+ prefix_map,
13
+ resource: { slug: "about" },
14
+ resourceType: "page",
15
+ locale: "en",
16
+ defaultLocale: "en",
17
+ });
18
+
19
+ expect(result).toBe("/about");
20
+ });
21
+
22
+ test("prepends locale when not default", () => {
23
+ const result = buildResourcePath({
24
+ prefix_map,
25
+ resource: { slug: "hello" },
26
+ resourceType: "article",
27
+ locale: "bg",
28
+ defaultLocale: "en",
29
+ });
30
+
31
+ expect(result).toBe("/bg/blog/hello");
32
+ });
33
+
34
+ test("works for nested prefix", () => {
35
+ const result = buildResourcePath({
36
+ prefix_map,
37
+ resource: { slug: "summit" },
38
+ resourceType: "event",
39
+ locale: "de",
40
+ defaultLocale: "en",
41
+ });
42
+
43
+ expect(result).toBe("/de/events/summit");
44
+ });
45
+
46
+ test("collapses leading double slash for page resourceType in default locale", () => {
47
+ const result = buildResourcePath({
48
+ prefix_map,
49
+ resource: { slug: "" },
50
+ resourceType: "page",
51
+ locale: "en",
52
+ defaultLocale: "en",
53
+ });
54
+
55
+ expect(result).toBe("/");
56
+ });
57
+
58
+ test("throws when resourceType has no prefix mapping", () => {
59
+ expect(() =>
60
+ buildResourcePath({
61
+ prefix_map,
62
+ resource: { slug: "foo" },
63
+ resourceType: "unknown",
64
+ locale: "en",
65
+ defaultLocale: "en",
66
+ })
67
+ ).toThrow("Unknown resource type: unknown");
68
+ });
69
+ });