@raketa-cloud/admin 0.0.102 → 0.0.103

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 (370) hide show
  1. package/package.json +2 -1
  2. package/src/Adapter.js +265 -0
  3. package/src/HonoAdapter.js +269 -0
  4. package/src/Logger.js +21 -0
  5. package/src/RaketaContext.js +46 -0
  6. package/src/buildResourcePath.js +22 -0
  7. package/src/cipher.js +49 -0
  8. package/src/cloud/ArticleChanges.js +36 -0
  9. package/src/cloud/ArticleRevisions.js +239 -0
  10. package/src/cloud/Articles.js +194 -0
  11. package/src/cloud/Categories.js +97 -0
  12. package/src/cloud/EventChanges.js +36 -0
  13. package/src/cloud/EventRevisions.js +246 -0
  14. package/src/cloud/Events.js +204 -0
  15. package/src/cloud/PageChanges.js +36 -0
  16. package/src/cloud/PageRevisions.js +226 -0
  17. package/src/cloud/Pages.js +185 -0
  18. package/src/cloud/RaketaClient.js +223 -0
  19. package/src/cloud/Redirects.js +81 -0
  20. package/src/cloud/Settings.js +28 -0
  21. package/src/cloud/Tags.js +80 -0
  22. package/src/cloud/documents/articlesDocuments.js +343 -0
  23. package/src/cloud/documents/categoryDocuments.js +52 -0
  24. package/src/cloud/documents/common.js +133 -0
  25. package/src/cloud/documents/eventsDocuments.js +351 -0
  26. package/src/cloud/documents/pagesDocuments.js +339 -0
  27. package/src/cloud/documents/redirectsDocuments.js +82 -0
  28. package/src/cloud/documents/settingsDocuments.js +23 -0
  29. package/src/cloud/documents/tagsDocuments.js +63 -0
  30. package/src/currentPath.cjs +1 -0
  31. package/src/handlers/DashboardsHandler.js +9 -0
  32. package/src/handlers/RedirectsHandler.js +124 -0
  33. package/src/handlers/TagsHandler.js +113 -0
  34. package/src/handlers/_shared/SettingsHandler.js +36 -0
  35. package/src/handlers/article_revisions/ArticleRevisionsHandler.js +49 -0
  36. package/src/handlers/article_revisions/CancelSchedulesHandler.js +26 -0
  37. package/src/handlers/article_revisions/CodeHandler.js +74 -0
  38. package/src/handlers/article_revisions/GeneralHandler.js +76 -0
  39. package/src/handlers/article_revisions/LocksHandler.js +77 -0
  40. package/src/handlers/article_revisions/MetaHandler.js +74 -0
  41. package/src/handlers/article_revisions/PublishesHandler.js +120 -0
  42. package/src/handlers/article_revisions/RevertsHandler.js +28 -0
  43. package/src/handlers/article_revisions/TagHandler.js +82 -0
  44. package/src/handlers/article_revisions/UnlocksHandler.js +24 -0
  45. package/src/handlers/article_revisions/VisualHandler.js +74 -0
  46. package/src/handlers/article_revisions/WidgetHandler.js +47 -0
  47. package/src/handlers/articles/ArticlesHandler.js +109 -0
  48. package/src/handlers/articles/ClonesHandler.js +19 -0
  49. package/src/handlers/articles/DeletesHandler.js +72 -0
  50. package/src/handlers/articles/HistoryHandler.js +31 -0
  51. package/src/handlers/articles/TranslationsHandler.js +231 -0
  52. package/src/handlers/articles/URLsHandler.js +83 -0
  53. package/src/handlers/categories/index.js +122 -0
  54. package/src/handlers/event_revisions/CancelSchedulesHandler.js +26 -0
  55. package/src/handlers/event_revisions/CodeHandler.js +72 -0
  56. package/src/handlers/event_revisions/EventRevisionsHandler.js +47 -0
  57. package/src/handlers/event_revisions/GeneralHandler.js +74 -0
  58. package/src/handlers/event_revisions/LocksHandler.js +65 -0
  59. package/src/handlers/event_revisions/MetaHandler.js +72 -0
  60. package/src/handlers/event_revisions/PublishesHandler.js +112 -0
  61. package/src/handlers/event_revisions/RevertsHandler.js +26 -0
  62. package/src/handlers/event_revisions/TagHandler.js +79 -0
  63. package/src/handlers/event_revisions/UnlocksHandler.js +24 -0
  64. package/src/handlers/event_revisions/VisualHandler.js +72 -0
  65. package/src/handlers/event_revisions/WidgetHandler.js +41 -0
  66. package/src/handlers/events/ClonesHandler.js +19 -0
  67. package/src/handlers/events/DeletesHandler.js +72 -0
  68. package/src/handlers/events/EventsHandler.js +111 -0
  69. package/src/handlers/events/HistoryHandler.js +31 -0
  70. package/src/handlers/events/TranslationsHandler.js +233 -0
  71. package/src/handlers/events/URLsHandler.js +81 -0
  72. package/src/handlers/page_revisions/CancelSchedulesHandler.js +26 -0
  73. package/src/handlers/page_revisions/CodeHandler.js +57 -0
  74. package/src/handlers/page_revisions/GeneralHandler.js +59 -0
  75. package/src/handlers/page_revisions/LocksHandler.js +69 -0
  76. package/src/handlers/page_revisions/MetaHandler.js +57 -0
  77. package/src/handlers/page_revisions/PageRevisionsHandler.js +47 -0
  78. package/src/handlers/page_revisions/PublishesHandler.js +112 -0
  79. package/src/handlers/page_revisions/RevertsHandler.js +26 -0
  80. package/src/handlers/page_revisions/TagHandler.js +105 -0
  81. package/src/handlers/page_revisions/UnlocksHandler.js +22 -0
  82. package/src/handlers/page_revisions/VisualHandler.js +58 -0
  83. package/src/handlers/page_revisions/WidgetHandler.js +41 -0
  84. package/src/handlers/pages/ClonesHandler.js +19 -0
  85. package/src/handlers/pages/DeletesHandler.js +68 -0
  86. package/src/handlers/pages/HistoryHandler.js +31 -0
  87. package/src/handlers/pages/PagesHandler.js +104 -0
  88. package/src/handlers/pages/TranslationsHandler.js +233 -0
  89. package/src/handlers/pages/URLsHandler.js +77 -0
  90. package/src/helpers/AuthHelper.js +49 -0
  91. package/src/helpers/FormBuilder.js +438 -0
  92. package/src/helpers/HTMLBuilder.js +38 -0
  93. package/src/helpers/Inflector.js +9 -0
  94. package/src/helpers/Pagination.js +92 -0
  95. package/src/helpers/SortButton.js +102 -0
  96. package/src/helpers/form_for.js +8 -0
  97. package/src/helpers/historyUtils.js +133 -0
  98. package/src/helpers/pagination_helper.js +5 -0
  99. package/src/helpers/sort_button.js +5 -0
  100. package/src/helpers/utils.js +21 -0
  101. package/src/routeArticlesModule.js +151 -0
  102. package/src/routeCategoriesModule.js +16 -0
  103. package/src/routeCollection.js +90 -0
  104. package/src/routeEventsModule.js +166 -0
  105. package/src/routeMember.js +40 -0
  106. package/src/routeNestedCollection.js +96 -0
  107. package/src/routeNestedMember.js +46 -0
  108. package/src/routePagesModule.js +163 -0
  109. package/src/routeSettings.js +14 -0
  110. package/src/routeStandard.js +35 -0
  111. package/src/setGlobalContext.js +5 -0
  112. package/src/setupAuthentication.js +154 -0
  113. package/src/setupCloud.js +50 -0
  114. package/src/styles/application.css +561 -0
  115. package/src/tests/Adapter.test.js +39 -0
  116. package/src/tests/HonoAdapter.test.js +34 -0
  117. package/src/tests/Logger.test.js +33 -0
  118. package/src/tests/handlers/DashboardsHandler.test/index.test.js +17 -0
  119. package/src/tests/handlers/RedirectsHandler.test/create.test.js +83 -0
  120. package/src/tests/handlers/RedirectsHandler.test/create_form.test.js +27 -0
  121. package/src/tests/handlers/RedirectsHandler.test/destroy.test.js +53 -0
  122. package/src/tests/handlers/RedirectsHandler.test/edit_form.test.js +37 -0
  123. package/src/tests/handlers/RedirectsHandler.test/index.test.js +41 -0
  124. package/src/tests/handlers/RedirectsHandler.test/show.test.js +41 -0
  125. package/src/tests/handlers/RedirectsHandler.test/update.test.js +88 -0
  126. package/src/tests/handlers/TagsHandler.test/create.test.js +96 -0
  127. package/src/tests/handlers/TagsHandler.test/create_form.test.js +25 -0
  128. package/src/tests/handlers/TagsHandler.test/destroy.test.js +51 -0
  129. package/src/tests/handlers/TagsHandler.test/edit_form.test.js +60 -0
  130. package/src/tests/handlers/TagsHandler.test/index.test.js +37 -0
  131. package/src/tests/handlers/TagsHandler.test/update.test.js +105 -0
  132. package/src/tests/handlers/_shared/SettingsHandler.test/edit_form.test.js +36 -0
  133. package/src/tests/handlers/_shared/SettingsHandler.test/update.test.js +114 -0
  134. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/create.test.js +79 -0
  135. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/destroy.test.js +57 -0
  136. package/src/tests/handlers/article_revisions/CancelScheduledHandler.test/create.test.js +90 -0
  137. package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +56 -0
  138. package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +161 -0
  139. package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +59 -0
  140. package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +162 -0
  141. package/src/tests/handlers/article_revisions/LocksHandler.test/create.test.js +142 -0
  142. package/src/tests/handlers/article_revisions/LocksHandler.test/create_form.test.js +55 -0
  143. package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +56 -0
  144. package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +163 -0
  145. package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +333 -0
  146. package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +48 -0
  147. package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +86 -0
  148. package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +72 -0
  149. package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +153 -0
  150. package/src/tests/handlers/article_revisions/UnlocksHandler.test/create.test.js +84 -0
  151. package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +56 -0
  152. package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +146 -0
  153. package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +46 -0
  154. package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +103 -0
  155. package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +172 -0
  156. package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +44 -0
  157. package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +57 -0
  158. package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +109 -0
  159. package/src/tests/handlers/articles/ArticlesHistoryHandler.test/index.test.js +87 -0
  160. package/src/tests/handlers/articles/ClonesHandler.test/create.test.js +57 -0
  161. package/src/tests/handlers/articles/DeletesHandler.test/create.test.js +115 -0
  162. package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +60 -0
  163. package/src/tests/handlers/articles/TranslationHandler.test/create.test.js +297 -0
  164. package/src/tests/handlers/articles/TranslationHandler.test/create_form.test.js +71 -0
  165. package/src/tests/handlers/articles/TranslationHandler.test/index.test.js +91 -0
  166. package/src/tests/handlers/articles/URLsHandler.test/create.test.js +160 -0
  167. package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +55 -0
  168. package/src/tests/handlers/categories/create.test.js +94 -0
  169. package/src/tests/handlers/categories/create_form.test.js +26 -0
  170. package/src/tests/handlers/categories/destroy.test.js +57 -0
  171. package/src/tests/handlers/categories/edit_form.test.js +59 -0
  172. package/src/tests/handlers/categories/index.test.js +46 -0
  173. package/src/tests/handlers/categories/update.test.js +88 -0
  174. package/src/tests/handlers/event_revisions/CancelScheduledHandler.test/create.test.js +90 -0
  175. package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +60 -0
  176. package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +171 -0
  177. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/create.test.js +79 -0
  178. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/destroy.test.js +57 -0
  179. package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +63 -0
  180. package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +172 -0
  181. package/src/tests/handlers/event_revisions/LocksHandler.test/create.test.js +142 -0
  182. package/src/tests/handlers/event_revisions/LocksHandler.test/create_form.test.js +55 -0
  183. package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +60 -0
  184. package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +173 -0
  185. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +333 -0
  186. package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +48 -0
  187. package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +83 -0
  188. package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +76 -0
  189. package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +163 -0
  190. package/src/tests/handlers/event_revisions/UnlocksHandler.test/create.test.js +84 -0
  191. package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +60 -0
  192. package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +156 -0
  193. package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +46 -0
  194. package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +103 -0
  195. package/src/tests/handlers/events/ClonesHandler.test/create.test.js +57 -0
  196. package/src/tests/handlers/events/DeletesHandler.test/create.test.js +115 -0
  197. package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +60 -0
  198. package/src/tests/handlers/events/EventsHandler.test/create.test.js +172 -0
  199. package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +45 -0
  200. package/src/tests/handlers/events/EventsHandler.test/index.test.js +53 -0
  201. package/src/tests/handlers/events/EventsHandler.test/show.test.js +109 -0
  202. package/src/tests/handlers/events/EventsHistoryHandler.test/index.test.js +87 -0
  203. package/src/tests/handlers/events/TranslationHandler.test/create.test.js +303 -0
  204. package/src/tests/handlers/events/TranslationHandler.test/create_form.test.js +71 -0
  205. package/src/tests/handlers/events/TranslationHandler.test/index.test.js +91 -0
  206. package/src/tests/handlers/events/URLsHandler.test/create.test.js +160 -0
  207. package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +55 -0
  208. package/src/tests/handlers/page_revisions/CancelScheduledHandler.test/create.test.js +86 -0
  209. package/src/tests/handlers/page_revisions/CodesHandler.test/edit_form.test.js +58 -0
  210. package/src/tests/handlers/page_revisions/CodesHandler.test/update.test.js +154 -0
  211. package/src/tests/handlers/page_revisions/GeneralHandler.test/edit_form.test.js +54 -0
  212. package/src/tests/handlers/page_revisions/GeneralHandler.test/update.test.js +166 -0
  213. package/src/tests/handlers/page_revisions/LocksHandler.test/create.test.js +138 -0
  214. package/src/tests/handlers/page_revisions/LocksHandler.test/create_form.test.js +55 -0
  215. package/src/tests/handlers/page_revisions/MetaHandler.test/edit_form.test.js +51 -0
  216. package/src/tests/handlers/page_revisions/MetaHandler.test/update.test.js +159 -0
  217. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/create.test.js +71 -0
  218. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/destroy.test.js +57 -0
  219. package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +333 -0
  220. package/src/tests/handlers/page_revisions/PublishesHandler.test/create_form.test.js +48 -0
  221. package/src/tests/handlers/page_revisions/RevertsHandler.test/create.test.js +83 -0
  222. package/src/tests/handlers/page_revisions/TagHandler.test/edit_form.test.js +100 -0
  223. package/src/tests/handlers/page_revisions/TagHandler.test/update.test.js +180 -0
  224. package/src/tests/handlers/page_revisions/UnlocksHandler.test/create.test.js +80 -0
  225. package/src/tests/handlers/page_revisions/VisualHandler.test.test/edit_form.test.js +58 -0
  226. package/src/tests/handlers/page_revisions/VisualHandler.test.test/update.test.js +139 -0
  227. package/src/tests/handlers/page_revisions/WidgetHandler.test/show.test.js +46 -0
  228. package/src/tests/handlers/page_revisions/WidgetHandler.test/update.test.js +103 -0
  229. package/src/tests/handlers/pages/ConesHandler.test/create.test.js +57 -0
  230. package/src/tests/handlers/pages/DeletesHandler.test/create.test.js +115 -0
  231. package/src/tests/handlers/pages/DeletesHandler.test/create_form.test.js +60 -0
  232. package/src/tests/handlers/pages/PagesHandler.test/create.test.js +167 -0
  233. package/src/tests/handlers/pages/PagesHandler.test/create_form.test.js +41 -0
  234. package/src/tests/handlers/pages/PagesHandler.test/index.test.js +53 -0
  235. package/src/tests/handlers/pages/PagesHandler.test/show.test.js +107 -0
  236. package/src/tests/handlers/pages/PagesHistoryHandler.test/index.test.js +87 -0
  237. package/src/tests/handlers/pages/TranslationHandler.test/create.test.js +290 -0
  238. package/src/tests/handlers/pages/TranslationHandler.test/create_form.test.js +71 -0
  239. package/src/tests/handlers/pages/TranslationHandler.test/index.test.js +87 -0
  240. package/src/tests/handlers/pages/URLsHandler.test/create.test.js +160 -0
  241. package/src/tests/handlers/pages/URLsHandler.test/create_form.test.js +58 -0
  242. package/src/tests/helpers/AuthHelper.test.js +169 -0
  243. package/src/tests/helpers/FormBuildert.test.js +357 -0
  244. package/src/tests/helpers/HTMLBuilder.test.js +44 -0
  245. package/src/tests/helpers/Inflector.test.js +75 -0
  246. package/src/tests/helpers/Pagination.test.js +65 -0
  247. package/src/tests/helpers/SortButton.test.js +85 -0
  248. package/src/tests/helpers/historyUtils.test.js +107 -0
  249. package/src/tests/helpers/utils.test.js +27 -0
  250. package/src/tests/routeCollection.test.js +163 -0
  251. package/src/tests/routeMember.test.js +97 -0
  252. package/src/tests/routeNestedCollection.test.js +182 -0
  253. package/src/tests/routeNestedMember.test.js +102 -0
  254. package/src/tests/support/factory.js +194 -0
  255. package/src/tests/support/handlersHelper.js +31 -0
  256. package/src/utils.js +30 -0
  257. package/src/views/_auth/login.ejs +82 -0
  258. package/src/views/_shared/_credentials_input.ejs +31 -0
  259. package/src/views/_shared/_layout_input.ejs +5 -0
  260. package/src/views/_shared/_scripts_input.ejs +5 -0
  261. package/src/views/_shared/_structured_json_input.ejs +7 -0
  262. package/src/views/article_revisions/_nav.ejs +44 -0
  263. package/src/views/article_revisions/codes/_form.ejs +13 -0
  264. package/src/views/article_revisions/codes/edit_form.ejs +16 -0
  265. package/src/views/article_revisions/general/_form.ejs +17 -0
  266. package/src/views/article_revisions/general/edit_form.ejs +16 -0
  267. package/src/views/article_revisions/locks/_form.ejs +11 -0
  268. package/src/views/article_revisions/locks/create_form.ejs +27 -0
  269. package/src/views/article_revisions/meta/_form.ejs +15 -0
  270. package/src/views/article_revisions/meta/edit_form.ejs +16 -0
  271. package/src/views/article_revisions/publishes/_form.ejs +70 -0
  272. package/src/views/article_revisions/publishes/create_form.ejs +9 -0
  273. package/src/views/article_revisions/tags/_form.ejs +12 -0
  274. package/src/views/article_revisions/tags/edit_form.ejs +16 -0
  275. package/src/views/article_revisions/visuals/_form.ejs +12 -0
  276. package/src/views/article_revisions/visuals/edit_form.ejs +16 -0
  277. package/src/views/articles/_form.ejs +45 -0
  278. package/src/views/articles/_shared/_history_toolbar.ejs +24 -0
  279. package/src/views/articles/_shared/_revision_toolbar.ejs +68 -0
  280. package/src/views/articles/_shared/_title.ejs +11 -0
  281. package/src/views/articles/_shared/_toolbar.ejs +33 -0
  282. package/src/views/articles/_shared/history_table.ejs +68 -0
  283. package/src/views/articles/create_form.ejs +9 -0
  284. package/src/views/articles/deletes/create_form.ejs +68 -0
  285. package/src/views/articles/history/index.ejs +87 -0
  286. package/src/views/articles/index.ejs +171 -0
  287. package/src/views/articles/show.ejs +234 -0
  288. package/src/views/articles/translations/_translation_toolbar.ejs +18 -0
  289. package/src/views/articles/translations/create_form.ejs +75 -0
  290. package/src/views/articles/translations/index.ejs +39 -0
  291. package/src/views/articles/urls/create_form.ejs +36 -0
  292. package/src/views/categories/_form.ejs +24 -0
  293. package/src/views/categories/create_form.ejs +9 -0
  294. package/src/views/categories/edit_form.ejs +9 -0
  295. package/src/views/categories/index.ejs +35 -0
  296. package/src/views/dashboard/index.ejs +23 -0
  297. package/src/views/event_revisions/_nav.ejs +44 -0
  298. package/src/views/event_revisions/codes/_form.ejs +13 -0
  299. package/src/views/event_revisions/codes/edit_form.ejs +16 -0
  300. package/src/views/event_revisions/general/_form.ejs +19 -0
  301. package/src/views/event_revisions/general/edit_form.ejs +16 -0
  302. package/src/views/event_revisions/locks/_form.ejs +11 -0
  303. package/src/views/event_revisions/locks/create_form.ejs +27 -0
  304. package/src/views/event_revisions/meta/_form.ejs +15 -0
  305. package/src/views/event_revisions/meta/edit_form.ejs +16 -0
  306. package/src/views/event_revisions/publishes/_form.ejs +77 -0
  307. package/src/views/event_revisions/publishes/create_form.ejs +9 -0
  308. package/src/views/event_revisions/tags/_form.ejs +12 -0
  309. package/src/views/event_revisions/tags/edit_form.ejs +16 -0
  310. package/src/views/event_revisions/visuals/_form.ejs +12 -0
  311. package/src/views/event_revisions/visuals/edit_form.ejs +16 -0
  312. package/src/views/events/_form.ejs +47 -0
  313. package/src/views/events/_shared/_history_toolbar.ejs +24 -0
  314. package/src/views/events/_shared/_revision_toolbar.ejs +68 -0
  315. package/src/views/events/_shared/_title.ejs +12 -0
  316. package/src/views/events/_shared/_toolbar.ejs +33 -0
  317. package/src/views/events/_shared/history_table.ejs +68 -0
  318. package/src/views/events/create_form.ejs +9 -0
  319. package/src/views/events/deletes/create_form.ejs +68 -0
  320. package/src/views/events/history/index.ejs +87 -0
  321. package/src/views/events/index.ejs +171 -0
  322. package/src/views/events/show.ejs +234 -0
  323. package/src/views/events/translations/_translation_toolbar.ejs +18 -0
  324. package/src/views/events/translations/create_form.ejs +75 -0
  325. package/src/views/events/translations/index.ejs +39 -0
  326. package/src/views/events/urls/create_form.ejs +36 -0
  327. package/src/views/layouts/application.ejs +239 -0
  328. package/src/views/layouts/header.ejs +47 -0
  329. package/src/views/page_revisions/_nav.ejs +44 -0
  330. package/src/views/page_revisions/codes/_form.ejs +13 -0
  331. package/src/views/page_revisions/codes/edit_form.ejs +16 -0
  332. package/src/views/page_revisions/general/_form.ejs +16 -0
  333. package/src/views/page_revisions/general/edit_form.ejs +16 -0
  334. package/src/views/page_revisions/locks/_form.ejs +11 -0
  335. package/src/views/page_revisions/locks/create_form.ejs +27 -0
  336. package/src/views/page_revisions/meta/_form.ejs +15 -0
  337. package/src/views/page_revisions/meta/edit_form.ejs +16 -0
  338. package/src/views/page_revisions/publishes/_form.ejs +76 -0
  339. package/src/views/page_revisions/publishes/create_form.ejs +9 -0
  340. package/src/views/page_revisions/tags/_form.ejs +12 -0
  341. package/src/views/page_revisions/tags/edit_form.ejs +21 -0
  342. package/src/views/page_revisions/visuals/_form.ejs +12 -0
  343. package/src/views/page_revisions/visuals/edit_form.ejs +16 -0
  344. package/src/views/pages/_form.ejs +44 -0
  345. package/src/views/pages/_shared/_history_toolbar.ejs +24 -0
  346. package/src/views/pages/_shared/_revision_toolbar.ejs +68 -0
  347. package/src/views/pages/_shared/_title.ejs +12 -0
  348. package/src/views/pages/_shared/_toolbar.ejs +33 -0
  349. package/src/views/pages/_shared/history_table.ejs +68 -0
  350. package/src/views/pages/create_form.ejs +9 -0
  351. package/src/views/pages/deletes/create_form.ejs +68 -0
  352. package/src/views/pages/history/index.ejs +87 -0
  353. package/src/views/pages/index.ejs +166 -0
  354. package/src/views/pages/show.ejs +235 -0
  355. package/src/views/pages/translations/_translation_toolbar.ejs +18 -0
  356. package/src/views/pages/translations/create_form.ejs +75 -0
  357. package/src/views/pages/translations/index.ejs +39 -0
  358. package/src/views/pages/urls/create_form.ejs +36 -0
  359. package/src/views/redirects/_form.ejs +26 -0
  360. package/src/views/redirects/create_form.ejs +9 -0
  361. package/src/views/redirects/edit_form.ejs +9 -0
  362. package/src/views/redirects/index.ejs +75 -0
  363. package/src/views/redirects/show.ejs +60 -0
  364. package/src/views/settings/_nav.ejs +22 -0
  365. package/src/views/settings/layout/edit_form.ejs +58 -0
  366. package/src/views/settings/meta/edit_form.ejs +24 -0
  367. package/src/views/tags/_form.ejs +25 -0
  368. package/src/views/tags/create_form.ejs +9 -0
  369. package/src/views/tags/edit_form.ejs +9 -0
  370. package/src/views/tags/index.ejs +43 -0
@@ -0,0 +1,169 @@
1
+ import AuthHelper from "../../helpers/AuthHelper";
2
+
3
+ describe("AuthHelper", () => {
4
+ describe("parseJWT", () => {
5
+ test("parses JWT token correctly", () => {
6
+ const payload = { user: "test", exp: 1735689600 };
7
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
8
+ "base64"
9
+ );
10
+ const mockToken = `header.${encodedPayload}.signature`;
11
+
12
+ const result = AuthHelper.parseJWT(mockToken);
13
+ expect(result).toEqual(payload);
14
+ });
15
+ });
16
+
17
+ describe("verifyJWT", () => {
18
+ test("returns true for valid non-expired token", () => {
19
+ const futureTime = Math.floor(Date.now() / 1000) + 3600;
20
+ const payload = { exp: futureTime };
21
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
22
+ "base64"
23
+ );
24
+ const mockToken = `header.${encodedPayload}.signature`;
25
+
26
+ const result = AuthHelper.verifyJWT(mockToken);
27
+ expect(result).toBe(true);
28
+ });
29
+
30
+ test("returns false for expired token", () => {
31
+ const pastTime = Math.floor(Date.now() / 1000) - 3600;
32
+ const payload = { exp: pastTime };
33
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
34
+ "base64"
35
+ );
36
+ const mockToken = `header.${encodedPayload}.signature`;
37
+
38
+ const result = AuthHelper.verifyJWT(mockToken);
39
+ expect(result).toBe(false);
40
+ });
41
+
42
+ test("returns false for token without exp", () => {
43
+ const payload = { user: "test" };
44
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
45
+ "base64"
46
+ );
47
+ const mockToken = `header.${encodedPayload}.signature`;
48
+
49
+ const result = AuthHelper.verifyJWT(mockToken);
50
+ expect(result).toBe(false);
51
+ });
52
+ });
53
+
54
+ describe("isAuthenticated", () => {
55
+ test("returns true for allowed paths", () => {
56
+ expect(AuthHelper.isAuthenticated({ path: "/login" })).toBe(true);
57
+ expect(
58
+ AuthHelper.isAuthenticated({ path: "/auth/google/callback" })
59
+ ).toBe(true);
60
+ expect(AuthHelper.isAuthenticated({ path: "/remote/verify" })).toBe(true);
61
+ });
62
+
63
+ test("returns true for valid token", () => {
64
+ const futureTime = Math.floor(Date.now() / 1000) + 3600;
65
+ const payload = { exp: futureTime };
66
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
67
+ "base64"
68
+ );
69
+ const mockToken = `header.${encodedPayload}.signature`;
70
+
71
+ expect(
72
+ AuthHelper.isAuthenticated({
73
+ path: "/protected",
74
+ token: mockToken,
75
+ })
76
+ ).toBe(true);
77
+ });
78
+
79
+ test("returns false for invalid token", () => {
80
+ const pastTime = Math.floor(Date.now() / 1000) - 3600;
81
+ const payload = { exp: pastTime };
82
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString(
83
+ "base64"
84
+ );
85
+ const mockToken = `header.${encodedPayload}.signature`;
86
+
87
+ expect(
88
+ AuthHelper.isAuthenticated({
89
+ path: "/protected",
90
+ token: mockToken,
91
+ })
92
+ ).toBe(false);
93
+ });
94
+
95
+ test("returns false for protected path without token", () => {
96
+ expect(
97
+ AuthHelper.isAuthenticated({
98
+ path: "/protected",
99
+ })
100
+ ).toBe(false);
101
+ });
102
+ });
103
+
104
+ describe("getGoogleURL", () => {
105
+ test("returns correct URL with valid params", () => {
106
+ const params = {
107
+ gateway_url: "https://gateway.example.com",
108
+ gateway_project: "project1",
109
+ gateway_user_pool: "pool1",
110
+ auth_callback_url: "https://app.example.com/callback",
111
+ };
112
+
113
+ const expectedURL =
114
+ "https://gateway.example.com/users/auth/project1/pool1/google?return_to=https://app.example.com/callback";
115
+
116
+ expect(AuthHelper.getGoogleURL(params)).toBe(expectedURL);
117
+ });
118
+
119
+ test("throws error when any of the required params is missing or blank - auth_callback_url", () => {
120
+ const params = {
121
+ gateway_url: "https://gateway.example.com",
122
+ gateway_project: "project1",
123
+ gateway_user_pool: "pool1",
124
+ auth_callback_url: "",
125
+ };
126
+
127
+ expect(() => {
128
+ AuthHelper.getGoogleURL(params);
129
+ }).toThrow("Invalid ENVs for authentication configuration");
130
+ });
131
+
132
+ test("throws error when any of the required params is missing or blank - gateway_user_pool", () => {
133
+ const params = {
134
+ gateway_url: "https://gateway.example.com",
135
+ gateway_project: "project1",
136
+ auth_callback_url: "https://app.example.com/callback",
137
+ };
138
+
139
+ expect(() => {
140
+ AuthHelper.getGoogleURL(params);
141
+ }).toThrow("Invalid ENVs for authentication configuration");
142
+ });
143
+
144
+ test("throws error when any of the required params is missing or blank - gateway_project", () => {
145
+ const params = {
146
+ gateway_url: "https://gateway.example.com",
147
+ gateway_project: "",
148
+ gateway_user_pool: "pool1",
149
+ auth_callback_url: "https://app.example.com/callback",
150
+ };
151
+
152
+ expect(() => {
153
+ AuthHelper.getGoogleURL(params);
154
+ }).toThrow("Invalid ENVs for authentication configuration");
155
+ });
156
+
157
+ test("throws error when any of the required params is missing or blank - gateway_url", () => {
158
+ const params = {
159
+ gateway_project: "project1",
160
+ gateway_user_pool: "pool1",
161
+ auth_callback_url: "https://app.example.com/callback",
162
+ };
163
+
164
+ expect(() => {
165
+ AuthHelper.getGoogleURL(params);
166
+ }).toThrow("Invalid ENVs for authentication configuration");
167
+ });
168
+ });
169
+ });
@@ -0,0 +1,357 @@
1
+ import FormBuilder from "../../helpers/FormBuilder";
2
+
3
+ describe("FormBuilder", () => {
4
+ function normalizeHTML(html) {
5
+ return html.replace(/>\s+</g, "><").replace(/\s+/g, " ").trim();
6
+ }
7
+
8
+ describe("field", () => {
9
+ test("renders a text input group", () => {
10
+ const form = new FormBuilder({
11
+ resource: {
12
+ title: "Test content",
13
+ },
14
+ });
15
+
16
+ const result = form.field("resource.title");
17
+
18
+ expect(normalizeHTML(result)).toEqual(
19
+ normalizeHTML(`
20
+ <div class="mb-4">
21
+ <label for="f_resource_title">Title</label>
22
+ <input type="text" name="resource[title]" value="Test content" id="f_resource_title" />
23
+ </div>`)
24
+ );
25
+ });
26
+
27
+ test("renders a text input group with errors", () => {
28
+ const form = new FormBuilder(
29
+ {
30
+ resource: {
31
+ title: "Test content",
32
+ },
33
+ },
34
+ {
35
+ resource: {
36
+ title: "Can't be blank",
37
+ },
38
+ }
39
+ );
40
+
41
+ const result = form.field("resource.title");
42
+
43
+ expect(normalizeHTML(result)).toEqual(
44
+ normalizeHTML(`
45
+ <div class="mb-4 has-error">
46
+ <label for="f_resource_title">Title</label>
47
+ <input type="text" name="resource[title]" value="Test content" id="f_resource_title" />
48
+ <span class="text-red-600">Can't be blank</span>
49
+ </div>`)
50
+ );
51
+ });
52
+
53
+ test("renders an email input group", () => {
54
+ const form = new FormBuilder({
55
+ resource: {
56
+ email: "john@example.com",
57
+ },
58
+ });
59
+
60
+ const result = form.field("resource.email", { label: "Electronic mail" });
61
+
62
+ expect(normalizeHTML(result)).toEqual(
63
+ normalizeHTML(
64
+ `<div class="mb-4">
65
+ <label for="f_resource_email">Electronic mail</label>
66
+ <input type="text" name="resource[email]" value="john@example.com" id="f_resource_email" />
67
+ </div>`
68
+ )
69
+ );
70
+ });
71
+
72
+ test("renders a textarea group", () => {
73
+ const form = new FormBuilder({
74
+ resource: {
75
+ description: "Lorem ipsum dolor...",
76
+ },
77
+ });
78
+
79
+ const result = form.field("resource.description", { as: "textarea" });
80
+
81
+ expect(normalizeHTML(result)).toEqual(
82
+ normalizeHTML(
83
+ `<div class="mb-4">
84
+ <label for="f_resource_description">Description</label>
85
+ <textarea name="resource[description]" id="f_resource_description">Lorem ipsum dolor...</textarea>
86
+ </div>`
87
+ )
88
+ );
89
+ });
90
+
91
+ test("renders a single checkbox group with default value", () => {
92
+ const form = new FormBuilder({
93
+ resource: {
94
+ active: "yes",
95
+ },
96
+ });
97
+
98
+ const result = form.field("resource.description", {
99
+ as: "checkbox",
100
+ value: "yes",
101
+ default_value: "no",
102
+ });
103
+
104
+ expect(normalizeHTML(result)).toEqual(
105
+ normalizeHTML(
106
+ `<div class="mb-4">
107
+ <div class="checkbox-wrapper">
108
+ <input type="hidden" name="resource[description]" value="no" />
109
+ <input type="checkbox" value="yes" id="f_resource_description" name="resource[description]" />
110
+ <label for="f_resource_description">Description</label>
111
+ </div>
112
+ </div>`
113
+ )
114
+ );
115
+ });
116
+
117
+ test("renders a single checkbox group without default value", () => {
118
+ const form = new FormBuilder({
119
+ resource: {
120
+ active: "yes",
121
+ },
122
+ });
123
+
124
+ const result = form.field("resource.active", {
125
+ as: "checkbox",
126
+ value: "yes",
127
+ });
128
+
129
+ expect(normalizeHTML(result)).toEqual(
130
+ normalizeHTML(
131
+ `<div class="mb-4">
132
+ <div class="checkbox-wrapper">
133
+ <input type="checkbox" value="yes" id="f_resource_active" name="resource[active]" checked="checked" />
134
+ <label for="f_resource_active">Active</label>
135
+ </div>
136
+ </div>`
137
+ )
138
+ );
139
+ });
140
+
141
+ test("renders a select group", () => {
142
+ const form = new FormBuilder({
143
+ resource: {
144
+ layout: "default",
145
+ },
146
+ });
147
+
148
+ const result = form.field("resource.layout", {
149
+ as: "select",
150
+ options: [
151
+ ["default", "Default"],
152
+ ["headless", "Headless"],
153
+ ],
154
+ });
155
+
156
+ expect(normalizeHTML(result)).toEqual(
157
+ normalizeHTML(
158
+ `<div class="mb-4">
159
+ <label for="f_resource_layout">Layout</label>
160
+ <select name="resource[layout]" id="f_resource_layout">
161
+ <option value="">Please select...</option>
162
+ <option value="default" selected="selected">Default</option>
163
+ <option value="headless">Headless</option>
164
+ </select>
165
+ </div>`
166
+ )
167
+ );
168
+ });
169
+
170
+ test("renders a readio group", () => {
171
+ const form = new FormBuilder({
172
+ resource: {
173
+ color: "red",
174
+ },
175
+ });
176
+
177
+ const result = form.field("resource.color", {
178
+ as: "radio_group",
179
+ options: [
180
+ ["red", "Red"],
181
+ ["blue", "Blue"],
182
+ ["green", "Green"],
183
+ ],
184
+ });
185
+
186
+ expect(normalizeHTML(result)).toEqual(
187
+ normalizeHTML(
188
+ `<div class="mb-4">
189
+ <label for="f_resource_color">Color</label>
190
+ <div id="f_resource_color" name="resource[color]" class="radio-group">
191
+ <label ><input type="radio" name="resource[color]" value="red" checked="checked" /> Red</label>
192
+ <label ><input type="radio" name="resource[color]" value="blue" /> Blue</label>
193
+ <label ><input type="radio" name="resource[color]" value="green" /> Green</label>
194
+ </div>
195
+ </div>`
196
+ )
197
+ );
198
+ });
199
+
200
+ test("renders a checkbox group", () => {
201
+ const form = new FormBuilder({
202
+ resource: {
203
+ color: "red",
204
+ },
205
+ });
206
+
207
+ const result = form.field("resource.color", {
208
+ as: "checkbox_group",
209
+ options: [
210
+ ["red", "Red"],
211
+ ["blue", "Blue"],
212
+ ["green", "Green"],
213
+ ],
214
+ });
215
+
216
+ expect(normalizeHTML(result)).toEqual(
217
+ normalizeHTML(
218
+ `<div class="mb-4">
219
+ <label for="f_resource_color">Color</label>
220
+ <div id="f_resource_color" class="checkbox-group">
221
+ <label ><input type="checkbox" name="resource[color][]" value="red" checked="checked" /> Red</label>
222
+ <label ><input type="checkbox" name="resource[color][]" value="blue" /> Blue</label>
223
+ <label ><input type="checkbox" name="resource[color][]" value="green" /> Green</label>
224
+ <input type="hidden" name="resource[color][]" value="" />
225
+ </div>
226
+ </div>`
227
+ )
228
+ );
229
+ });
230
+
231
+ test("renders a button input group", () => {
232
+ const form = new FormBuilder({
233
+ resource: {
234
+ cta: {
235
+ label: "CTA!",
236
+ link: "#",
237
+ },
238
+ },
239
+ });
240
+
241
+ const result = form.field("resource.cta", {
242
+ as: "button",
243
+ });
244
+
245
+ expect(normalizeHTML(result)).toEqual(
246
+ normalizeHTML(`
247
+ <fieldset class="button-group">
248
+ <legend >Cta</legend>
249
+ <div class="mb-4">
250
+ <label for="f_resource_cta_label">Label</label>
251
+ <input type="text" name="resource[cta][label]" value="CTA!" id="f_resource_cta_label" class="no-margin" />
252
+ </div>
253
+ <div class="mb-4">
254
+ <label for="f_resource_cta_link">Link</label>
255
+ <input type="text" name="resource[cta][link]" value="#" id="f_resource_cta_link" class="no-margin" />
256
+ </div>
257
+ <div class="mb-4">
258
+ <label for="f_resource_cta_id">ID</label>
259
+ <input type="text" name="resource[cta][id]" value="" id="f_resource_cta_id" class="no-margin" />
260
+ </div>
261
+ <div class="mb-4">
262
+ <label for="f_resource_cta_type">Type</label>
263
+ <select name="resource[cta][type]" id="f_resource_cta_type" class="no-margin">
264
+ <option value="">Please select...</option>
265
+ <option value="primary">Primary</option>
266
+ <option value="secondary">Secondary</option>
267
+ <option value="text">Text</option>
268
+ </select>
269
+ </div>
270
+ <div class="mb-4">
271
+ <label for="f_resource_cta_target">Target</label>
272
+ <select name="resource[cta][target]" id="f_resource_cta_target" class="no-margin">
273
+ <option value="">Please select...</option>
274
+ <option value="_self">Self</option>
275
+ <option value="_blank">New Tab</option>
276
+ </select>
277
+ </div>
278
+ <div class="mb-4">
279
+ <label for="f_resource_cta_rel">Follow Link</label>
280
+ <select name="resource[cta][rel]" id="f_resource_cta_rel" class="no-margin">
281
+ <option value="">Please select...</option>
282
+ <option value="follow">Follow</option>
283
+ <option value="nofollow">No Follow</option>
284
+ </select>
285
+ </div>
286
+ </fieldset>`)
287
+ );
288
+ });
289
+
290
+ test("renders a link input group", () => {
291
+ const form = new FormBuilder({
292
+ resource: {
293
+ cta: {
294
+ label: "CTA!",
295
+ link: "#",
296
+ },
297
+ },
298
+ });
299
+
300
+ const result = form.field("resource.cta", {
301
+ as: "link",
302
+ });
303
+
304
+ expect(normalizeHTML(result)).toEqual(
305
+ normalizeHTML(
306
+ `
307
+ <fieldset class="link-group">
308
+ <legend >Cta</legend>
309
+ <div class="mb-4">
310
+ <label for="f_resource_cta_label">Label</label>
311
+ <input type="text" name="resource[cta][label]" value="CTA!" id="f_resource_cta_label" class="no-margin" />
312
+ </div>
313
+ <div class="mb-4">
314
+ <label for="f_resource_cta_link">Link</label>
315
+ <input type="text" name="resource[cta][link]" value="#" id="f_resource_cta_link" class="no-margin" />
316
+ </div>
317
+ <div class="mb-4">
318
+ <label for="f_resource_cta_id">ID</label>
319
+ <input type="text" name="resource[cta][id]" value="" id="f_resource_cta_id" class="no-margin" />
320
+ </div>
321
+ <div class="mb-4">
322
+ <label for="f_resource_cta_className">CSS Class</label>
323
+ <input type="text" name="resource[cta][className]" value="" id="f_resource_cta_className" class="no-margin" />
324
+ </div>
325
+ <div class="mb-4">
326
+ <label for="f_resource_cta_target">Target</label>
327
+ <select name="resource[cta][target]" id="f_resource_cta_target" class="no-margin">
328
+ <option value="">Please select...</option>
329
+ <option value="_self">Self</option>
330
+ <option value="_blank">New Tab</option>
331
+ </select>
332
+ </div>
333
+ <div class="mb-4">
334
+ <label for="f_resource_cta_rel">Follow Link</label>
335
+ <select name="resource[cta][rel]" id="f_resource_cta_rel" class="no-margin">
336
+ <option value="">Please select...</option>
337
+ <option value="follow">Follow</option>
338
+ <option value="nofollow">No Follow</option>
339
+ </select>
340
+ </div>
341
+ </fieldset>`
342
+ )
343
+ );
344
+ });
345
+ });
346
+
347
+ describe("submit", () => {
348
+ test("renders submit button with custom class", () => {
349
+ const form = new FormBuilder();
350
+ const result = form.submit("Save", { class: "btn-primary" });
351
+
352
+ expect(normalizeHTML(result)).toEqual(
353
+ '<button type="submit" class="btn-primary">Save</button>'
354
+ );
355
+ });
356
+ });
357
+ });
@@ -0,0 +1,44 @@
1
+ import HTMLBuilder from "../../helpers/HTMLBuilder";
2
+
3
+ describe("HTMLBuilder", () => {
4
+ function normalizeHTML(html) {
5
+ return html.replace(/>\s+</g, "><").replace(/\s+/g, " ").trim();
6
+ }
7
+
8
+ describe("tag", () => {
9
+ test("renders a self closing tag", () => {
10
+ const builder = new HTMLBuilder();
11
+
12
+ const result = builder.tag("img", null, { src: "/some-image.jpg" });
13
+
14
+ expect(normalizeHTML(result)).toEqual(
15
+ normalizeHTML('<img src="/some-image.jpg" />')
16
+ );
17
+ });
18
+
19
+ test("renders a label tag", () => {
20
+ const builder = new HTMLBuilder();
21
+
22
+ const result = builder.tag("label", "Heelo", { for: "some-input-id" });
23
+
24
+ expect(normalizeHTML(result)).toEqual(
25
+ normalizeHTML('<label for="some-input-id">Heelo</label>')
26
+ );
27
+ });
28
+
29
+ test("renders a textarea tag", () => {
30
+ const builder = new HTMLBuilder();
31
+
32
+ const result = builder.tag(
33
+ "textarea",
34
+ undefined,
35
+ { id: "some-input-id", value: "Text?" },
36
+ { nonVoid: true }
37
+ );
38
+
39
+ expect(normalizeHTML(result)).toEqual(
40
+ normalizeHTML('<textarea id="some-input-id" value="Text?"></textarea>')
41
+ );
42
+ });
43
+ });
44
+ });
@@ -0,0 +1,75 @@
1
+ import Inflector from "../../helpers/Inflector";
2
+
3
+ describe("Inflector", () => {
4
+ describe("capitalize", () => {
5
+ test("capitalizes first letter", () => {
6
+ expect(Inflector.capitalize("hello")).toBe("Hello");
7
+ });
8
+
9
+ test("keeps rest of string unchanged", () => {
10
+ expect(Inflector.capitalize("hELLo")).toBe("HELLo");
11
+ });
12
+
13
+ test("works with single letter", () => {
14
+ expect(Inflector.capitalize("h")).toBe("H");
15
+ });
16
+
17
+ test("handles already capitalized strings", () => {
18
+ expect(Inflector.capitalize("Hello")).toBe("Hello");
19
+ });
20
+ });
21
+
22
+ describe("downcase", () => {
23
+ test("converts string to lowercase", () => {
24
+ expect(Inflector.downcase("HELLO")).toBe("hello");
25
+ });
26
+
27
+ test("keeps lowercase strings unchanged", () => {
28
+ expect(Inflector.downcase("hello")).toBe("hello");
29
+ });
30
+
31
+ test("handles mixed case", () => {
32
+ expect(Inflector.downcase("HeLLo")).toBe("hello");
33
+ });
34
+
35
+ test("works with single letter", () => {
36
+ expect(Inflector.downcase("H")).toBe("h");
37
+ });
38
+ });
39
+
40
+ describe("humanize", () => {
41
+ test("replaces underscores with spaces", () => {
42
+ expect(Inflector.humanize("hello_world")).toBe("hello world");
43
+ });
44
+
45
+ test("replaces multiple underscores with single space", () => {
46
+ expect(Inflector.humanize("hello__world")).toBe("hello world");
47
+ });
48
+
49
+ test("replaces dashes with spaces", () => {
50
+ expect(Inflector.humanize("hello-world")).toBe("hello world");
51
+ });
52
+
53
+ test("replaces multiple dashes with single space", () => {
54
+ expect(Inflector.humanize("hello--world")).toBe("hello world");
55
+ });
56
+
57
+ test("handles mixed dashes and underscores", () => {
58
+ expect(Inflector.humanize("hello_beautiful-world")).toBe(
59
+ "hello beautiful world"
60
+ );
61
+ });
62
+
63
+ test("handles string with no replacements needed", () => {
64
+ expect(Inflector.humanize("hello world")).toBe("hello world");
65
+ });
66
+
67
+ test("handles empty string", () => {
68
+ expect(Inflector.humanize("")).toBe("");
69
+ });
70
+
71
+ test("handles string with only separators", () => {
72
+ expect(Inflector.humanize("___---___")).toBe(" ");
73
+ });
74
+ });
75
+ });