@fc3/mmcadi 0.1.20 → 0.1.23

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 (373) hide show
  1. package/bin/lint +12 -0
  2. package/bin/test-one +32 -0
  3. package/dist/.last-compile-time +1 -1
  4. package/dist/.last-publish-time +1 -1
  5. package/dist/client.js +264 -47
  6. package/dist/src/client/enum/page-type.d.ts +5 -1
  7. package/dist/src/client/enum/page-type.js +4 -0
  8. package/dist/src/client/enum/page-type.js.map +1 -1
  9. package/dist/src/client/factory/page.js +9 -1
  10. package/dist/src/client/factory/page.js.map +1 -1
  11. package/dist/src/client/page/confirm-hide-block.d.ts +7 -0
  12. package/dist/src/client/page/confirm-hide-block.js +28 -0
  13. package/dist/src/client/page/confirm-hide-block.js.map +1 -0
  14. package/dist/src/client/page/history.d.ts +16 -0
  15. package/dist/src/client/page/history.js +126 -0
  16. package/dist/src/client/page/history.js.map +1 -0
  17. package/dist/src/client/page/role.d.ts +5 -0
  18. package/dist/src/client/page/role.js +12 -0
  19. package/dist/src/client/page/role.js.map +1 -0
  20. package/dist/src/client/page/select-block-destination.d.ts +5 -0
  21. package/dist/src/client/page/select-block-destination.js +12 -0
  22. package/dist/src/client/page/select-block-destination.js.map +1 -0
  23. package/dist/src/client/page/view-custom.d.ts +3 -1
  24. package/dist/src/client/page/view-custom.js +60 -26
  25. package/dist/src/client/page/view-custom.js.map +1 -1
  26. package/dist/src/client/utility/get-block-activation-href.d.ts +2 -0
  27. package/dist/src/client/utility/get-block-activation-href.js +25 -0
  28. package/dist/src/client/utility/get-block-activation-href.js.map +1 -0
  29. package/dist/src/common/builder/block/folder.d.ts +2 -1
  30. package/dist/src/common/builder/block/folder.js.map +1 -1
  31. package/dist/src/common/builder/block/header.d.ts +5 -1
  32. package/dist/src/common/builder/block/header.js +16 -2
  33. package/dist/src/common/builder/block/header.js.map +1 -1
  34. package/dist/src/common/builder/block/parameter.d.ts +3 -0
  35. package/dist/src/common/builder/block/parameter.js +19 -0
  36. package/dist/src/common/builder/block/parameter.js.map +1 -0
  37. package/dist/src/constant/role/creator.d.ts +3 -0
  38. package/dist/src/constant/role/creator.js +17 -0
  39. package/dist/src/constant/role/creator.js.map +1 -0
  40. package/dist/src/constant/role/public.d.ts +3 -0
  41. package/dist/src/constant/role/public.js +17 -0
  42. package/dist/src/constant/role/public.js.map +1 -0
  43. package/dist/src/constant/role/unknown.d.ts +3 -0
  44. package/dist/src/constant/role/unknown.js +17 -0
  45. package/dist/src/constant/role/unknown.js.map +1 -0
  46. package/dist/src/enum/action-type.d.ts +2 -0
  47. package/dist/src/enum/action-type.js +2 -0
  48. package/dist/src/enum/action-type.js.map +1 -1
  49. package/dist/src/enum/block-type.d.ts +2 -1
  50. package/dist/src/enum/block-type.js +1 -0
  51. package/dist/src/enum/block-type.js.map +1 -1
  52. package/dist/src/enum/default-role.d.ts +2 -1
  53. package/dist/src/enum/default-role.js +1 -0
  54. package/dist/src/enum/default-role.js.map +1 -1
  55. package/dist/src/enum/emoji.d.ts +2 -0
  56. package/dist/src/enum/emoji.js +2 -0
  57. package/dist/src/enum/emoji.js.map +1 -1
  58. package/dist/src/enum/tool-type.d.ts +1 -0
  59. package/dist/src/enum/tool-type.js +1 -0
  60. package/dist/src/enum/tool-type.js.map +1 -1
  61. package/dist/src/index.d.ts +2 -0
  62. package/dist/src/index.js +3 -1
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/interface/route.d.ts +2 -1
  65. package/dist/src/lib/environment-mocker/index.d.ts +18 -0
  66. package/dist/src/lib/environment-mocker/index.js +40 -0
  67. package/dist/src/lib/environment-mocker/index.js.map +1 -0
  68. package/dist/src/lib/grammar/index.d.ts +3 -0
  69. package/dist/src/lib/grammar/index.js +7 -1
  70. package/dist/src/lib/grammar/index.js.map +1 -1
  71. package/dist/src/lib/grammar/utility/pluralize.d.ts +2 -0
  72. package/dist/src/lib/grammar/utility/pluralize.js +12 -0
  73. package/dist/src/lib/grammar/utility/pluralize.js.map +1 -0
  74. package/dist/src/lib/grammar/utility/singularize-or-pluralize.d.ts +2 -0
  75. package/dist/src/lib/grammar/utility/singularize-or-pluralize.js +12 -0
  76. package/dist/src/lib/grammar/utility/singularize-or-pluralize.js.map +1 -0
  77. package/dist/src/lib/grammar/utility/singularize.d.ts +2 -0
  78. package/dist/src/lib/grammar/utility/singularize.js +12 -0
  79. package/dist/src/lib/grammar/utility/singularize.js.map +1 -0
  80. package/dist/src/lib/log-capturer/index.d.ts +2 -0
  81. package/dist/src/lib/log-capturer/index.js +8 -0
  82. package/dist/src/lib/log-capturer/index.js.map +1 -0
  83. package/dist/src/lib/log-capturer/log-capturer.d.ts +19 -0
  84. package/dist/src/lib/log-capturer/log-capturer.js +39 -0
  85. package/dist/src/lib/log-capturer/log-capturer.js.map +1 -0
  86. package/dist/src/lib/server/http/endpoint.js +1 -1
  87. package/dist/src/lib/server/http/endpoint.js.map +1 -1
  88. package/dist/src/lib/string/create-slug.js +2 -1
  89. package/dist/src/lib/string/create-slug.js.map +1 -1
  90. package/dist/src/server/endpoint/abstract-page.d.ts +1 -1
  91. package/dist/src/server/endpoint/abstract-page.js +21 -3
  92. package/dist/src/server/endpoint/abstract-page.js.map +1 -1
  93. package/dist/src/server/endpoint/account/get.d.ts +14 -0
  94. package/dist/src/server/endpoint/account/get.js +34 -0
  95. package/dist/src/server/endpoint/account/get.js.map +1 -0
  96. package/dist/src/server/endpoint/action/create.d.ts +3 -1
  97. package/dist/src/server/endpoint/action/create.js +63 -52
  98. package/dist/src/server/endpoint/action/create.js.map +1 -1
  99. package/dist/src/server/endpoint/action/get.d.ts +3 -1
  100. package/dist/src/server/endpoint/action/get.js +47 -1
  101. package/dist/src/server/endpoint/action/get.js.map +1 -1
  102. package/dist/src/server/endpoint/history.d.ts +13 -0
  103. package/dist/src/server/endpoint/history.js +61 -0
  104. package/dist/src/server/endpoint/history.js.map +1 -0
  105. package/dist/src/server/endpoint/login.d.ts +1 -1
  106. package/dist/src/server/endpoint/login.js +1 -1
  107. package/dist/src/server/endpoint/login.js.map +1 -1
  108. package/dist/src/server/endpoint/logout.js +7 -2
  109. package/dist/src/server/endpoint/logout.js.map +1 -1
  110. package/dist/src/server/endpoint/month.d.ts +1 -1
  111. package/dist/src/server/endpoint/month.js +1 -1
  112. package/dist/src/server/endpoint/month.js.map +1 -1
  113. package/dist/src/server/endpoint/role/get.d.ts +14 -0
  114. package/dist/src/server/endpoint/role/get.js +43 -0
  115. package/dist/src/server/endpoint/role/get.js.map +1 -0
  116. package/dist/src/server/endpoint/settings/get.d.ts +1 -1
  117. package/dist/src/server/endpoint/settings/get.js +1 -1
  118. package/dist/src/server/endpoint/settings/get.js.map +1 -1
  119. package/dist/src/server/endpoint/week.d.ts +1 -1
  120. package/dist/src/server/endpoint/week.js +1 -1
  121. package/dist/src/server/endpoint/week.js.map +1 -1
  122. package/dist/src/server/endpoint/year.d.ts +1 -1
  123. package/dist/src/server/endpoint/year.js +1 -1
  124. package/dist/src/server/endpoint/year.js.map +1 -1
  125. package/dist/src/server/enum/custom-page-type.d.ts +3 -1
  126. package/dist/src/server/enum/custom-page-type.js +2 -0
  127. package/dist/src/server/enum/custom-page-type.js.map +1 -1
  128. package/dist/src/server/factory/block-result-serializer.d.ts +1 -1
  129. package/dist/src/server/factory/block-result-serializer.js +16 -13
  130. package/dist/src/server/factory/block-result-serializer.js.map +1 -1
  131. package/dist/src/server/factory/block-serializer.d.ts +15 -0
  132. package/dist/src/server/factory/block-serializer.js +80 -0
  133. package/dist/src/server/factory/block-serializer.js.map +1 -0
  134. package/dist/src/server/middleware/error-handler.js +21 -6
  135. package/dist/src/server/middleware/error-handler.js.map +1 -1
  136. package/dist/src/server/operation/add-block.js +1 -0
  137. package/dist/src/server/operation/add-block.js.map +1 -1
  138. package/dist/src/server/operation/delete-block.d.ts +5 -3
  139. package/dist/src/server/operation/delete-block.js +30 -9
  140. package/dist/src/server/operation/delete-block.js.map +1 -1
  141. package/dist/src/server/operation/destroy-session.js +13 -1
  142. package/dist/src/server/operation/destroy-session.js.map +1 -1
  143. package/dist/src/server/operation/find-account.d.ts +1 -0
  144. package/dist/src/server/operation/find-account.js +12 -3
  145. package/dist/src/server/operation/find-account.js.map +1 -1
  146. package/dist/src/server/operation/hide-block.d.ts +14 -0
  147. package/dist/src/server/operation/hide-block.js +55 -0
  148. package/dist/src/server/operation/hide-block.js.map +1 -0
  149. package/dist/src/server/operation/load-account.js +5 -8
  150. package/dist/src/server/operation/load-account.js.map +1 -1
  151. package/dist/src/server/operation/load-page.d.ts +7 -4
  152. package/dist/src/server/operation/load-page.js +251 -74
  153. package/dist/src/server/operation/load-page.js.map +1 -1
  154. package/dist/src/server/operation/move-block.d.ts +16 -0
  155. package/dist/src/server/operation/move-block.js +101 -0
  156. package/dist/src/server/operation/move-block.js.map +1 -0
  157. package/dist/src/server/operation/store-file.d.ts +14 -0
  158. package/dist/src/server/operation/store-file.js +83 -0
  159. package/dist/src/server/operation/store-file.js.map +1 -0
  160. package/dist/src/server/operation/store-files.d.ts +15 -0
  161. package/dist/src/server/operation/store-files.js +84 -0
  162. package/dist/src/server/operation/store-files.js.map +1 -0
  163. package/dist/src/server/operation/update-block.js +4 -4
  164. package/dist/src/server/operation/update-block.js.map +1 -1
  165. package/dist/src/server/result-serializer/account.d.ts +9 -0
  166. package/dist/src/server/result-serializer/account.js +26 -0
  167. package/dist/src/server/result-serializer/account.js.map +1 -0
  168. package/dist/src/server/result-serializer/action.d.ts +2 -1
  169. package/dist/src/server/result-serializer/action.js +27 -18
  170. package/dist/src/server/result-serializer/action.js.map +1 -1
  171. package/dist/src/server/result-serializer/base.js +22 -4
  172. package/dist/src/server/result-serializer/base.js.map +1 -1
  173. package/dist/src/server/result-serializer/block/folder.js +25 -9
  174. package/dist/src/server/result-serializer/block/folder.js.map +1 -1
  175. package/dist/src/server/result-serializer/block/header.js +6 -2
  176. package/dist/src/server/result-serializer/block/header.js.map +1 -1
  177. package/dist/src/server/result-serializer/block/image.js +6 -3
  178. package/dist/src/server/result-serializer/block/image.js.map +1 -1
  179. package/dist/src/server/result-serializer/block/parameter.d.ts +6 -0
  180. package/dist/src/server/result-serializer/block/parameter.js +13 -0
  181. package/dist/src/server/result-serializer/block/parameter.js.map +1 -0
  182. package/dist/src/server/result-serializer/block.d.ts +2 -1
  183. package/dist/src/server/result-serializer/block.js +32 -13
  184. package/dist/src/server/result-serializer/block.js.map +1 -1
  185. package/dist/src/server/result-serializer/page.d.ts +2 -1
  186. package/dist/src/server/result-serializer/page.js +4 -4
  187. package/dist/src/server/result-serializer/page.js.map +1 -1
  188. package/dist/src/server/result-serializer/role.d.ts +9 -0
  189. package/dist/src/server/result-serializer/role.js +26 -0
  190. package/dist/src/server/result-serializer/role.js.map +1 -0
  191. package/dist/src/server/serializer/action.d.ts +40 -0
  192. package/dist/src/server/serializer/action.js +940 -0
  193. package/dist/src/server/serializer/action.js.map +1 -0
  194. package/dist/src/server/serializer/base.d.ts +31 -0
  195. package/dist/src/server/serializer/base.js +1222 -0
  196. package/dist/src/server/serializer/base.js.map +1 -0
  197. package/dist/src/server/serializer/block/audio.d.ts +6 -0
  198. package/dist/src/server/serializer/block/audio.js +26 -0
  199. package/dist/src/server/serializer/block/audio.js.map +1 -0
  200. package/dist/src/server/serializer/block/background.d.ts +6 -0
  201. package/dist/src/server/serializer/block/background.js +22 -0
  202. package/dist/src/server/serializer/block/background.js.map +1 -0
  203. package/dist/src/server/serializer/block/calendar.d.ts +7 -0
  204. package/dist/src/server/serializer/block/calendar.js +140 -0
  205. package/dist/src/server/serializer/block/calendar.js.map +1 -0
  206. package/dist/src/server/serializer/block/directory.d.ts +7 -0
  207. package/dist/src/server/serializer/block/directory.js +53 -0
  208. package/dist/src/server/serializer/block/directory.js.map +1 -0
  209. package/dist/src/server/serializer/block/ephemeral.d.ts +6 -0
  210. package/dist/src/server/serializer/block/ephemeral.js +16 -0
  211. package/dist/src/server/serializer/block/ephemeral.js.map +1 -0
  212. package/dist/src/server/serializer/block/folder.d.ts +14 -0
  213. package/dist/src/server/serializer/block/folder.js +145 -0
  214. package/dist/src/server/serializer/block/folder.js.map +1 -0
  215. package/dist/src/server/serializer/block/header.d.ts +6 -0
  216. package/dist/src/server/serializer/block/header.js +35 -0
  217. package/dist/src/server/serializer/block/header.js.map +1 -0
  218. package/dist/src/server/serializer/block/image.d.ts +6 -0
  219. package/dist/src/server/serializer/block/image.js +45 -0
  220. package/dist/src/server/serializer/block/image.js.map +1 -0
  221. package/dist/src/server/serializer/block/link.d.ts +6 -0
  222. package/dist/src/server/serializer/block/link.js +39 -0
  223. package/dist/src/server/serializer/block/link.js.map +1 -0
  224. package/dist/src/server/serializer/block/list.d.ts +13 -0
  225. package/dist/src/server/serializer/block/list.js +113 -0
  226. package/dist/src/server/serializer/block/list.js.map +1 -0
  227. package/dist/src/server/serializer/block/multi-column.d.ts +6 -0
  228. package/dist/src/server/serializer/block/multi-column.js +78 -0
  229. package/dist/src/server/serializer/block/multi-column.js.map +1 -0
  230. package/dist/src/server/serializer/block/note.d.ts +6 -0
  231. package/dist/src/server/serializer/block/note.js +40 -0
  232. package/dist/src/server/serializer/block/note.js.map +1 -0
  233. package/dist/src/server/serializer/block/parameter.d.ts +6 -0
  234. package/dist/src/server/serializer/block/parameter.js +13 -0
  235. package/dist/src/server/serializer/block/parameter.js.map +1 -0
  236. package/dist/src/server/serializer/block/todo.d.ts +6 -0
  237. package/dist/src/server/serializer/block/todo.js +76 -0
  238. package/dist/src/server/serializer/block/todo.js.map +1 -0
  239. package/dist/src/server/serializer/block/whitespace.d.ts +6 -0
  240. package/dist/src/server/serializer/block/whitespace.js +17 -0
  241. package/dist/src/server/serializer/block/whitespace.js.map +1 -0
  242. package/dist/src/server/serializer/block.d.ts +27 -0
  243. package/dist/src/server/serializer/block.js +226 -0
  244. package/dist/src/server/serializer/block.js.map +1 -0
  245. package/dist/src/server/serializer/common/time-place-options.d.ts +2 -0
  246. package/dist/src/server/serializer/common/time-place-options.js +34 -0
  247. package/dist/src/server/serializer/common/time-place-options.js.map +1 -0
  248. package/dist/src/server/serializer/history.d.ts +19 -0
  249. package/dist/src/server/serializer/history.js +77 -0
  250. package/dist/src/server/serializer/history.js.map +1 -0
  251. package/dist/src/server/serializer/login.d.ts +12 -0
  252. package/dist/src/server/serializer/login.js +54 -0
  253. package/dist/src/server/serializer/login.js.map +1 -0
  254. package/dist/src/server/serializer/month.d.ts +10 -0
  255. package/dist/src/server/serializer/month.js +160 -0
  256. package/dist/src/server/serializer/month.js.map +1 -0
  257. package/dist/src/server/serializer/page.d.ts +47 -0
  258. package/dist/src/server/serializer/page.js +454 -0
  259. package/dist/src/server/serializer/page.js.map +1 -0
  260. package/dist/src/server/serializer/settings.d.ts +9 -0
  261. package/dist/src/server/serializer/settings.js +80 -0
  262. package/dist/src/server/serializer/settings.js.map +1 -0
  263. package/dist/src/server/serializer/week.d.ts +10 -0
  264. package/dist/src/server/serializer/week.js +175 -0
  265. package/dist/src/server/serializer/week.js.map +1 -0
  266. package/dist/src/server/serializer/year.d.ts +10 -0
  267. package/dist/src/server/serializer/year.js +142 -0
  268. package/dist/src/server/serializer/year.js.map +1 -0
  269. package/dist/src/server/type/multipart-file.d.ts +7 -0
  270. package/dist/src/server/type/multipart-file.js +3 -0
  271. package/dist/src/server/type/multipart-file.js.map +1 -0
  272. package/dist/src/server/utility/extract-role.d.ts +3 -0
  273. package/dist/src/server/utility/extract-role.js +19 -0
  274. package/dist/src/server/utility/extract-role.js.map +1 -0
  275. package/dist/src/server/utility/get-custom-page-type-for-path.js +12 -0
  276. package/dist/src/server/utility/get-custom-page-type-for-path.js.map +1 -1
  277. package/dist/src/server/utility/get-emoji-for-tool-type.js +1 -0
  278. package/dist/src/server/utility/get-emoji-for-tool-type.js.map +1 -1
  279. package/dist/src/server/utility/get-key-for-role.d.ts +3 -0
  280. package/dist/src/server/utility/get-key-for-role.js +10 -0
  281. package/dist/src/server/utility/get-key-for-role.js.map +1 -0
  282. package/dist/src/server/utility/get-thumbnail-filename.d.ts +2 -0
  283. package/dist/src/server/utility/get-thumbnail-filename.js +10 -0
  284. package/dist/src/server/utility/get-thumbnail-filename.js.map +1 -0
  285. package/dist/src/server/utility/get-url-for-role.d.ts +3 -0
  286. package/dist/src/server/utility/get-url-for-role.js +13 -0
  287. package/dist/src/server/utility/get-url-for-role.js.map +1 -0
  288. package/dist/src/server/utility/role-matches.d.ts +3 -0
  289. package/dist/src/server/utility/role-matches.js +13 -0
  290. package/dist/src/server/utility/role-matches.js.map +1 -0
  291. package/dist/src/server/utility/satisfies-role.d.ts +3 -0
  292. package/dist/src/server/utility/satisfies-role.js +21 -0
  293. package/dist/src/server/utility/satisfies-role.js.map +1 -0
  294. package/dist/src/server.js +8 -8
  295. package/dist/src/server.js.map +1 -1
  296. package/dist/src/type/account-settings.d.ts +3 -2
  297. package/dist/src/type/account.d.ts +1 -1
  298. package/dist/src/type/action/hide-block.d.ts +9 -0
  299. package/dist/src/type/action/hide-block.js +3 -0
  300. package/dist/src/type/action/hide-block.js.map +1 -0
  301. package/dist/src/type/action/move-block.d.ts +10 -0
  302. package/dist/src/type/action/move-block.js +3 -0
  303. package/dist/src/type/action/move-block.js.map +1 -0
  304. package/dist/src/type/block/audio.d.ts +2 -0
  305. package/dist/src/type/block/image.d.ts +2 -0
  306. package/dist/src/type/block/parameter.d.ts +8 -0
  307. package/dist/src/type/block/parameter.js +3 -0
  308. package/dist/src/type/block/parameter.js.map +1 -0
  309. package/dist/src/type/block-metadata.d.ts +2 -1
  310. package/dist/src/type/block.d.ts +2 -2
  311. package/dist/src/type/color-value.d.ts +2 -0
  312. package/dist/src/type/color-value.js +3 -0
  313. package/dist/src/type/color-value.js.map +1 -0
  314. package/dist/src/type/history-item.d.ts +5 -0
  315. package/dist/src/type/history-item.js +3 -0
  316. package/dist/src/type/history-item.js.map +1 -0
  317. package/dist/src/type/page.d.ts +2 -0
  318. package/dist/src/type/request-context.d.ts +7 -0
  319. package/dist/src/type/request-context.js +3 -0
  320. package/dist/src/type/request-context.js.map +1 -0
  321. package/dist/src/type/role.d.ts +8 -0
  322. package/dist/src/{interface/provider.js → type/role.js} +1 -1
  323. package/dist/src/type/role.js.map +1 -0
  324. package/dist/src/type/runtime-config.d.ts +2 -1
  325. package/dist/src/type/server-settings.d.ts +2 -1
  326. package/dist/test/unit/lib/environment-mocker/environment-mocker.d.ts +1 -0
  327. package/dist/test/unit/lib/environment-mocker/environment-mocker.js +40 -0
  328. package/dist/test/unit/lib/environment-mocker/environment-mocker.js.map +1 -0
  329. package/dist/test/unit/lib/grammar/index.d.ts +1 -0
  330. package/dist/test/unit/lib/grammar/index.js +60 -0
  331. package/dist/test/unit/lib/grammar/index.js.map +1 -0
  332. package/dist/test/unit/lib/grammar/inflector.d.ts +1 -0
  333. package/dist/test/unit/lib/grammar/inflector.js +72 -0
  334. package/dist/test/unit/lib/grammar/inflector.js.map +1 -0
  335. package/dist/test/unit/lib/http/parser/url.d.ts +1 -0
  336. package/dist/test/unit/lib/http/parser/url.js +27 -0
  337. package/dist/test/unit/lib/http/parser/url.js.map +1 -0
  338. package/dist/test/unit/lib/http/response/outgoing.d.ts +1 -0
  339. package/dist/test/unit/lib/http/response/outgoing.js +38 -0
  340. package/dist/test/unit/lib/http/response/outgoing.js.map +1 -0
  341. package/dist/test/unit/lib/http/utility/get-status-code-for-error-type.d.ts +1 -0
  342. package/dist/test/unit/lib/http/utility/get-status-code-for-error-type.js +21 -0
  343. package/dist/test/unit/lib/http/utility/get-status-code-for-error-type.js.map +1 -0
  344. package/dist/test/unit/lib/key-generator/key-generator.d.ts +1 -0
  345. package/dist/test/unit/lib/key-generator/key-generator.js +23 -0
  346. package/dist/test/unit/lib/key-generator/key-generator.js.map +1 -0
  347. package/dist/test/unit/lib/log-capturer/log-capturer.d.ts +1 -0
  348. package/dist/test/unit/lib/log-capturer/log-capturer.js +35 -0
  349. package/dist/test/unit/lib/log-capturer/log-capturer.js.map +1 -0
  350. package/dist/test/unit/lib/logger/formatter.d.ts +1 -0
  351. package/dist/test/unit/lib/logger/formatter.js +32 -0
  352. package/dist/test/unit/lib/logger/formatter.js.map +1 -0
  353. package/dist/test/unit/lib/logger/logger.d.ts +1 -0
  354. package/dist/test/unit/lib/logger/logger.js +194 -0
  355. package/dist/test/unit/lib/logger/logger.js.map +1 -0
  356. package/dist/test/unit/lib/operation/operation.d.ts +1 -0
  357. package/dist/test/unit/lib/operation/operation.js +128 -0
  358. package/dist/test/unit/lib/operation/operation.js.map +1 -0
  359. package/dist/test/unit/lib/promise-wrapper/promise-wrapper.d.ts +1 -0
  360. package/dist/test/unit/lib/promise-wrapper/promise-wrapper.js +41 -0
  361. package/dist/test/unit/lib/promise-wrapper/promise-wrapper.js.map +1 -0
  362. package/dist/test/unit/lib/string/create-slug.d.ts +1 -0
  363. package/dist/test/unit/lib/string/create-slug.js +15 -0
  364. package/dist/test/unit/lib/string/create-slug.js.map +1 -0
  365. package/dist/test/unit/lib/time/utility/sleep.d.ts +1 -0
  366. package/dist/test/unit/lib/time/utility/sleep.js +20 -0
  367. package/dist/test/unit/lib/time/utility/sleep.js.map +1 -0
  368. package/dist/test/unit/server/operation/promote-block.js +11 -0
  369. package/dist/test/unit/server/operation/promote-block.js.map +1 -1
  370. package/dist/tsconfig.tsbuildinfo +1 -1
  371. package/package.json +11 -5
  372. package/dist/src/interface/provider.d.ts +0 -6
  373. package/dist/src/interface/provider.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ import ExecutionContext from './../../lib/execution-context/index';
2
+ import BaseOperation from './../../operation';
3
+ declare class HideBlockOperation extends BaseOperation<void> {
4
+ private path;
5
+ private index_path;
6
+ private page;
7
+ constructor(path: string, index_path: string, execution_context: ExecutionContext);
8
+ protected performInternal(): Promise<void>;
9
+ private loadPage;
10
+ private getPage;
11
+ private getPath;
12
+ private getIndexPath;
13
+ }
14
+ export default HideBlockOperation;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const errors_1 = require("./../../lib/errors/index.js");
7
+ const operation_1 = __importDefault(require("./../../operation.js"));
8
+ const load_page_1 = __importDefault(require("./load-page.js"));
9
+ const update_block_1 = __importDefault(require("./update-block.js"));
10
+ const get_siblings_and_index_for_index_path_1 = __importDefault(require("./../utility/get-siblings-and-index-for-index-path.js"));
11
+ class HideBlockOperation extends operation_1.default {
12
+ constructor(path, index_path, execution_context) {
13
+ super(execution_context);
14
+ this.path = path;
15
+ this.index_path = index_path;
16
+ }
17
+ async performInternal() {
18
+ await this.loadPage();
19
+ const page = this.getPage();
20
+ const index_path = this.getIndexPath();
21
+ const { siblings, index } = (0, get_siblings_and_index_for_index_path_1.default)(page, index_path);
22
+ const target_block = siblings[index];
23
+ if (target_block === undefined) {
24
+ throw new errors_1.InvalidError(`No block found at path to hide: ${index_path}`);
25
+ }
26
+ const execution_context = this.getExecutionContext();
27
+ const updated_block = {
28
+ ...target_block,
29
+ hidden: true
30
+ };
31
+ const update_operation = new update_block_1.default(page, updated_block, index_path, execution_context);
32
+ await update_operation.perform();
33
+ }
34
+ async loadPage() {
35
+ const path = this.getPath();
36
+ const execution_context = this.getExecutionContext();
37
+ const operation = new load_page_1.default(path, execution_context);
38
+ const page = await operation.perform();
39
+ this.page = page;
40
+ }
41
+ getPage() {
42
+ if (this.page === undefined) {
43
+ throw new errors_1.InvariantViolation('Tried to read page, but it was not set');
44
+ }
45
+ return this.page;
46
+ }
47
+ getPath() {
48
+ return this.path;
49
+ }
50
+ getIndexPath() {
51
+ return this.index_path;
52
+ }
53
+ }
54
+ exports.default = HideBlockOperation;
55
+ //# sourceMappingURL=hide-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hide-block.js","sourceRoot":"","sources":["../../../../src/server/operation/hide-block.ts"],"names":[],"mappings":";;;;;AACA,uCAA4D;AAE5D,0DAAsC;AAEtC,2EAA2D;AAC3D,iFAAiE;AACjE,iIAAmG;AAEnG,MAAM,kBAAmB,SAAQ,mBAAmB;IAKnD,YAAmB,IAAY,EAAE,UAAkB,EAAE,iBAAmC;QACvF,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAES,KAAK,CAAC,eAAe;QAC9B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,EAAC,QAAQ,EAAE,KAAK,EAAC,GAAG,IAAA,+CAA+B,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,qBAAY,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAErD,MAAM,aAAa,GAAG;YACrB,GAAG,YAAY;YACf,MAAM,EAAE,IAAI;SACZ,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,sBAAoB,CAChD,IAAI,EACJ,aAAa,EACb,UAAU,EACV,iBAAiB,CACjB,CAAC;QAEF,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,QAAQ;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,mBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAEvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAEO,OAAO;QACd,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,2BAAkB,CAAC,wCAAwC,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEO,OAAO;QACd,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEO,YAAY;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD;AAED,kBAAe,kBAAkB,CAAC"}
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const operation_1 = __importDefault(require("./../../operation.js"));
7
+ const find_account_1 = __importDefault(require("./find-account.js"));
7
8
  class LoadAccountOperation extends operation_1.default {
8
9
  async performInternal() {
9
10
  const execution_context = this.getExecutionContext();
@@ -11,16 +12,12 @@ class LoadAccountOperation extends operation_1.default {
11
12
  if (session === undefined) {
12
13
  return null;
13
14
  }
14
- const { username } = session;
15
- if (username === null) {
15
+ const { account_id } = session;
16
+ if (account_id === null) {
16
17
  return null;
17
18
  }
18
- const { repository } = this.getConfig();
19
- const account = await repository.getAccountForUsername(username);
20
- if (account === undefined) {
21
- return null;
22
- }
23
- return account;
19
+ const operation = new find_account_1.default(account_id, execution_context);
20
+ return operation.perform();
24
21
  }
25
22
  }
26
23
  exports.default = LoadAccountOperation;
@@ -1 +1 @@
1
- {"version":3,"file":"load-account.js","sourceRoot":"","sources":["../../../../src/server/operation/load-account.ts"],"names":[],"mappings":";;;;;AACA,0DAAsC;AAEtC,MAAM,oBAAqB,SAAQ,mBAA6B;IACrD,KAAK,CAAC,eAAe;QAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC;QAE/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,EAAC,QAAQ,EAAC,GAAG,OAAO,CAAC;QAE3B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,EAAC,UAAU,EAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEjE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AAED,kBAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"load-account.js","sourceRoot":"","sources":["../../../../src/server/operation/load-account.ts"],"names":[],"mappings":";;;;;AACA,0DAAsC;AACtC,iFAAiE;AAEjE,MAAM,oBAAqB,SAAQ,mBAA6B;IACrD,KAAK,CAAC,eAAe;QAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC;QAE/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,EAAC,UAAU,EAAC,GAAG,OAAO,CAAC;QAE7B,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,sBAAoB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAE1E,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;CACD;AAED,kBAAe,oBAAoB,CAAC"}
@@ -7,17 +7,20 @@ declare class LoadPageOperation extends BaseOperation<Page> {
7
7
  protected performInternal(): Promise<Page>;
8
8
  protected formatResult(result: Page): string;
9
9
  private generatePermissionDeniedPage;
10
- private determineRequiredReadRole;
11
- private satisfiesRole;
12
- private loadRawPageForPath;
10
+ private loadFolderBlock;
11
+ private determineRequiredRole;
12
+ private getCreatorUsername;
13
+ private loadRawPage;
13
14
  private shouldAutogenerate;
14
15
  private autogenerate;
15
16
  private autogenerateDate;
16
17
  private autogenerateError;
17
18
  private autogenerateIndex;
19
+ private autogenerateAccount;
20
+ private autogenerateRole;
18
21
  private getCustomPageType;
19
22
  private getPath;
20
- private loadCurrentRole;
23
+ private buildRequestContext;
21
24
  private getRoles;
22
25
  }
23
26
  export default LoadPageOperation;
@@ -6,22 +6,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const path_1 = __importDefault(require("path"));
7
7
  const promises_1 = require("fs/promises");
8
8
  const header_1 = __importDefault(require("./../../common/builder/block/header.js"));
9
+ const folder_1 = __importDefault(require("./../../common/builder/block/folder.js"));
9
10
  const note_1 = __importDefault(require("./../../common/builder/block/note.js"));
10
11
  const string_1 = require("./../../lib/string/index.js");
12
+ const grammar_1 = require("./../../lib/grammar/index.js");
11
13
  const filesystem_1 = require("./../../lib/filesystem/index.js");
12
14
  const http_1 = require("./../../lib/http/index.js");
13
15
  const errors_1 = require("./../../lib/errors/index.js");
14
16
  const operation_1 = __importDefault(require("./../../operation.js"));
15
17
  const path_to_date_1 = __importDefault(require("./../utility/path-to-date.js"));
16
18
  const get_path_for_folder_block_1 = __importDefault(require("./../utility/get-path-for-folder-block.js"));
19
+ const is_index_path_1 = __importDefault(require("./../utility/is-index-path.js"));
20
+ const get_url_for_role_1 = __importDefault(require("./../utility/get-url-for-role.js"));
21
+ const get_key_for_role_1 = __importDefault(require("./../utility/get-key-for-role.js"));
22
+ const default_role_1 = __importDefault(require("./../../enum/default-role.js"));
23
+ const satisfies_role_1 = __importDefault(require("./../utility/satisfies-role.js"));
17
24
  const permission_type_1 = __importDefault(require("./../../enum/permission-type.js"));
25
+ const public_1 = __importDefault(require("./../../constant/role/public.js"));
26
+ const role_matches_1 = __importDefault(require("./../utility/role-matches.js"));
27
+ const creator_1 = __importDefault(require("./../../constant/role/creator.js"));
28
+ const unknown_1 = __importDefault(require("./../../constant/role/unknown.js"));
18
29
  const system_id_1 = __importDefault(require("./../../constant/system-id.js"));
19
30
  const block_type_1 = __importDefault(require("./../../enum/block-type.js"));
20
31
  const get_block_permissions_1 = __importDefault(require("./../utility/get-block-permissions.js"));
21
32
  const get_parent_path_1 = __importDefault(require("./../../common/utility/get-parent-path.js"));
22
- const default_role_1 = __importDefault(require("./../../enum/default-role.js"));
23
33
  const validate_path_1 = __importDefault(require("./../utility/validate-path.js"));
24
34
  const load_account_1 = __importDefault(require("./load-account.js"));
35
+ const find_account_1 = __importDefault(require("./find-account.js"));
25
36
  const custom_page_type_1 = __importDefault(require("./../enum/custom-page-type.js"));
26
37
  const color_1 = __importDefault(require("./../../enum/color.js"));
27
38
  const get_weekday_name_1 = __importDefault(require("./../utility/get-weekday-name.js"));
@@ -34,6 +45,7 @@ const get_start_of_week_1 = __importDefault(require("./../utility/get-start-of-w
34
45
  const week_to_path_1 = __importDefault(require("./../utility/week-to-path.js"));
35
46
  const increment_date_1 = __importDefault(require("./../utility/increment-date.js"));
36
47
  const decrement_date_1 = __importDefault(require("./../utility/decrement-date.js"));
48
+ const extract_role_1 = __importDefault(require("./../utility/extract-role.js"));
37
49
  const date_less_than_1 = __importDefault(require("./../utility/date-less-than.js"));
38
50
  const create_date_1 = __importDefault(require("./../utility/create-date.js"));
39
51
  const dates_are_equal_1 = __importDefault(require("./../utility/dates-are-equal.js"));
@@ -47,121 +59,174 @@ class LoadPageOperation extends operation_1.default {
47
59
  this.path = path;
48
60
  }
49
61
  async performInternal() {
50
- const current_role = await this.loadCurrentRole();
51
- const required_role = await this.determineRequiredReadRole();
52
- if (!this.satisfiesRole(current_role, required_role)) {
53
- return this.generatePermissionDeniedPage(current_role, required_role);
62
+ const request_context = await this.buildRequestContext();
63
+ const folder_block = await this.loadFolderBlock(request_context);
64
+ const required_role = this.determineRequiredRole(folder_block);
65
+ const { role: current_role, path } = request_context;
66
+ const roles = this.getRoles();
67
+ if (!(0, satisfies_role_1.default)(roles, current_role, required_role)) {
68
+ return this.generatePermissionDeniedPage(current_role, required_role, folder_block);
69
+ }
70
+ try {
71
+ const raw_page = await this.loadRawPage(request_context);
72
+ const page = {
73
+ path,
74
+ folder: folder_block,
75
+ ...raw_page
76
+ };
77
+ (0, validate_page_1.default)(page);
78
+ return page;
79
+ }
80
+ catch (error) {
81
+ if ((0, errors_1.errorMatches)(error, errors_1.NotFoundError)) {
82
+ if (this.shouldAutogenerate()) {
83
+ return this.autogenerate();
84
+ }
85
+ }
86
+ throw error;
54
87
  }
55
- const path = this.getPath();
56
- const raw_page = await this.loadRawPageForPath(path);
57
- const page = {
58
- path,
59
- ...raw_page
60
- };
61
- (0, validate_page_1.default)(page);
62
- return page;
63
88
  }
64
89
  formatResult(result) {
65
90
  return result.path;
66
91
  }
67
- async generatePermissionDeniedPage(current_role, required_role) {
92
+ async generatePermissionDeniedPage(current_role, required_role, folder_block) {
68
93
  const path = this.getPath();
69
- const execution_context = this.getExecutionContext();
70
- const logged_in = execution_context.isLoggedIn();
71
- const requires_creator = required_role === default_role_1.default.CREATOR;
72
- const header_block = (0, header_1.default)('permission denied');
73
- const login_note = (0, note_1.default)(`do you need to [log in](/login)?`);
74
- const creator_username = '0xfc3';
75
- const role_label = (() => {
76
- if (requires_creator) {
77
- return `[${creator_username}]`;
78
- }
79
- else {
80
- return `[${required_role}] or higher`;
81
- }
82
- })();
83
- const role_note = (0, note_1.default)(`only ${role_label} can view this page.`);
84
- if (!logged_in) {
94
+ const requires_unknown = (0, role_matches_1.default)(required_role, unknown_1.default);
95
+ if (requires_unknown) {
96
+ const header_block = (0, header_1.default)(`${emoji_1.default.WARNING_SIGN} configuration error`, {
97
+ color: color_1.default.YELLOW
98
+ });
99
+ const explanation = (0, note_1.default)('this page is configured to require a role that is invalid or no longer supported. ' +
100
+ 'it\'s possible that this role used to exist, but has since been removed.');
85
101
  return {
86
102
  path,
103
+ folder: folder_block,
87
104
  blocks: [
88
105
  header_block,
89
- role_note,
90
- login_note
106
+ explanation
91
107
  ]
92
108
  };
93
109
  }
110
+ const requires_creator = (0, role_matches_1.default)(required_role, creator_1.default);
111
+ const login_note = (0, note_1.default)(`do you need to [log in](/login)?`);
112
+ const execution_context = this.getExecutionContext();
113
+ const logged_in = execution_context.isLoggedIn();
114
+ const header_block = (0, header_1.default)(`${emoji_1.default.LOCKED} permission denied`, {
115
+ color: color_1.default.MAROON
116
+ });
94
117
  if (requires_creator) {
118
+ const creator_username = await this.getCreatorUsername(folder_block);
119
+ const account_link = `<a href="/accounts/${creator_username}">[${creator_username}]</a>`;
120
+ const role_note = (0, note_1.default)(`only ${account_link} can view this page.`);
121
+ const blocks = [
122
+ header_block,
123
+ role_note,
124
+ ];
125
+ if (!logged_in) {
126
+ blocks.push(login_note);
127
+ }
95
128
  return {
96
129
  path,
97
- blocks: [
98
- header_block,
99
- role_note
100
- ]
130
+ blocks,
131
+ folder: folder_block
101
132
  };
102
133
  }
103
- const upgrade_note = (0, note_1.default)(`(you are only [${current_role}])`);
134
+ const role_url = (0, get_url_for_role_1.default)(required_role);
135
+ const role_link = `<a href="${role_url}">[${required_role.name}]</a>`;
136
+ const role_note = (0, note_1.default)(`only ${role_link} or higher can view this page.`);
137
+ const blocks = [
138
+ header_block,
139
+ role_note
140
+ ];
141
+ if (!logged_in) {
142
+ const upgrade_note = (0, note_1.default)(`(you are only [${current_role}])`);
143
+ blocks.push(upgrade_note);
144
+ }
104
145
  return {
105
146
  path,
106
- blocks: [
107
- header_block,
108
- role_note,
109
- upgrade_note
110
- ]
147
+ blocks,
148
+ folder: folder_block
111
149
  };
112
150
  }
113
- async determineRequiredReadRole() {
114
- const page_path = this.getPath();
115
- const parent_path = (0, get_parent_path_1.default)(page_path);
151
+ async loadFolderBlock(request_context) {
152
+ const { path: request_path } = request_context;
153
+ if ((0, is_index_path_1.default)(request_path)) {
154
+ return (0, folder_1.default)({
155
+ title: '/',
156
+ color: color_1.default.BLUE,
157
+ emoji: emoji_1.default.HOUSE
158
+ });
159
+ }
160
+ const parent_path = (0, get_parent_path_1.default)(request_path);
161
+ const parent_context = {
162
+ ...request_context,
163
+ path: parent_path
164
+ };
116
165
  let raw_page;
117
166
  try {
118
- raw_page = await this.loadRawPageForPath(parent_path);
167
+ raw_page = await this.loadRawPage(parent_context);
119
168
  }
120
169
  catch (error) {
121
170
  if ((0, errors_1.errorMatches)(error, errors_1.NotFoundError)) {
122
- return default_role_1.default.PUBLIC;
171
+ return (0, folder_1.default)({
172
+ title: 'file not found',
173
+ color: color_1.default.RED,
174
+ emoji: emoji_1.default.MAGNIFYING_GLASS
175
+ });
123
176
  }
124
177
  throw error;
125
178
  }
126
179
  const { blocks } = raw_page;
127
- const block = blocks.find((block) => {
180
+ const folder_block = blocks.find((block) => {
128
181
  const { block_type } = block;
129
182
  if (block_type !== block_type_1.default.FOLDER) {
130
183
  return false;
131
184
  }
132
- const folder_block = block;
133
- const folder_path = (0, get_path_for_folder_block_1.default)({
185
+ const potential_block = block;
186
+ const potential_path = (0, get_path_for_folder_block_1.default)({
134
187
  base_path: parent_path,
135
- block: folder_block
188
+ block: potential_block
136
189
  });
137
- return folder_path === page_path;
190
+ return potential_path === request_path;
138
191
  });
139
- if (block === undefined) {
140
- return default_role_1.default.PUBLIC;
192
+ if (folder_block === undefined) {
193
+ return (0, folder_1.default)({
194
+ title: 'file not found',
195
+ emoji: emoji_1.default.MAGNIFYING_GLASS,
196
+ color: color_1.default.RED
197
+ });
141
198
  }
142
- const permissions = (0, get_block_permissions_1.default)(block);
143
- const required_role = permissions[permission_type_1.default.READ];
144
- return required_role;
199
+ return folder_block;
145
200
  }
146
- satisfiesRole(current_role, required_role) {
201
+ determineRequiredRole(folder_block) {
202
+ const permissions = (0, get_block_permissions_1.default)(folder_block);
203
+ const required_role_key = permissions[permission_type_1.default.READ];
147
204
  const roles = this.getRoles();
148
- const current_index = roles.indexOf(current_role);
149
- const required_index = roles.indexOf(required_role);
150
- return current_index >= required_index;
205
+ const required_role = (0, extract_role_1.default)(roles, required_role_key);
206
+ return required_role;
207
+ }
208
+ async getCreatorUsername(folder_block) {
209
+ const account_id = folder_block.creator_id;
210
+ const execution_context = this.getExecutionContext();
211
+ const operation = new find_account_1.default(account_id, execution_context);
212
+ const account = await operation.perform();
213
+ const creator_username = account.username;
214
+ return creator_username;
151
215
  }
152
- async loadRawPageForPath(page_path) {
216
+ async loadRawPage(request_context) {
153
217
  const { public_directory, routes } = this.getConfig();
218
+ const { path: request_path } = request_context;
154
219
  let index = 0;
155
220
  const blocks = [];
156
221
  while (index < routes.length) {
157
222
  const route = routes[index++];
158
223
  const { path, handler } = route;
159
- if (page_path === path) {
160
- const subset = await handler(path);
224
+ if (request_path === path) {
225
+ const subset = await handler(request_context);
161
226
  blocks.push(...subset);
162
227
  }
163
228
  }
164
- const filename = `.${page_path}/index.json`;
229
+ const filename = `.${request_path}/index.json`;
165
230
  const absolute_path = path_1.default.resolve(public_directory, filename);
166
231
  const file_exists = await (0, filesystem_1.exists)(absolute_path);
167
232
  if (!file_exists) {
@@ -170,11 +235,8 @@ class LoadPageOperation extends operation_1.default {
170
235
  blocks
171
236
  };
172
237
  }
173
- else if (this.shouldAutogenerate()) {
174
- return this.autogenerate();
175
- }
176
238
  else {
177
- throw new errors_1.NotFoundError(`Unable to find page: ${page_path}`);
239
+ throw new errors_1.NotFoundError(`Unable to find page: ${request_path}`);
178
240
  }
179
241
  }
180
242
  const contents = await (0, promises_1.readFile)(absolute_path, string_1.StringEncoding.UTF8);
@@ -193,6 +255,8 @@ class LoadPageOperation extends operation_1.default {
193
255
  case custom_page_type_1.default.DATE:
194
256
  case custom_page_type_1.default.ERROR:
195
257
  case custom_page_type_1.default.INDEX:
258
+ case custom_page_type_1.default.ACCOUNT:
259
+ case custom_page_type_1.default.ROLE:
196
260
  return true;
197
261
  default:
198
262
  return false;
@@ -213,6 +277,10 @@ class LoadPageOperation extends operation_1.default {
213
277
  return this.autogenerateError();
214
278
  case custom_page_type_1.default.INDEX:
215
279
  return this.autogenerateIndex();
280
+ case custom_page_type_1.default.ACCOUNT:
281
+ return this.autogenerateAccount();
282
+ case custom_page_type_1.default.ROLE:
283
+ return this.autogenerateRole();
216
284
  default:
217
285
  throw new errors_1.InvalidError(`Unable to autogenerate page for path: ${path}`);
218
286
  }
@@ -258,6 +326,12 @@ class LoadPageOperation extends operation_1.default {
258
326
  const current_week_path = (0, week_to_path_1.default)(current_week);
259
327
  const current_week_label = (0, get_ordinal_label_for_week_1.default)(current_week);
260
328
  return {
329
+ path,
330
+ folder: (0, folder_1.default)({
331
+ title,
332
+ color: color_1.default.GREY,
333
+ emoji: emoji_1.default.CALENDAR
334
+ }),
261
335
  blocks: [
262
336
  {
263
337
  block_type: block_type_1.default.LINK,
@@ -328,6 +402,12 @@ class LoadPageOperation extends operation_1.default {
328
402
  }
329
403
  })();
330
404
  return {
405
+ path,
406
+ folder: (0, folder_1.default)({
407
+ title,
408
+ emoji: emoji_1.default.WARNING_SIGN,
409
+ color: color_1.default.RED
410
+ }),
331
411
  blocks: [
332
412
  (0, header_1.default)(title),
333
413
  {
@@ -341,10 +421,39 @@ class LoadPageOperation extends operation_1.default {
341
421
  }
342
422
  async autogenerateIndex() {
343
423
  const now = Date.now();
424
+ const path = this.getPath();
344
425
  const { username } = this.getSession();
426
+ const title = `${username}'s home page`;
427
+ return {
428
+ path,
429
+ folder: (0, folder_1.default)({
430
+ title,
431
+ emoji: emoji_1.default.HOUSE,
432
+ color: color_1.default.BLUE
433
+ }),
434
+ blocks: [
435
+ (0, header_1.default)(title),
436
+ {
437
+ block_type: block_type_1.default.EPHEMERAL,
438
+ label: '(nothing here yet)',
439
+ creator_id: system_id_1.default,
440
+ created_at: now
441
+ }
442
+ ]
443
+ };
444
+ }
445
+ async autogenerateAccount() {
446
+ const now = Date.now();
447
+ const path = this.getPath();
345
448
  return {
449
+ path,
450
+ folder: (0, folder_1.default)({
451
+ title: 'account',
452
+ emoji: emoji_1.default.USER_PORTRAIT,
453
+ color: color_1.default.MAROON
454
+ }),
346
455
  blocks: [
347
- (0, header_1.default)(`${username}'s home page`),
456
+ (0, header_1.default)('coming soon'),
348
457
  {
349
458
  block_type: block_type_1.default.EPHEMERAL,
350
459
  label: '(nothing here yet)',
@@ -354,6 +463,63 @@ class LoadPageOperation extends operation_1.default {
354
463
  ]
355
464
  };
356
465
  }
466
+ async autogenerateRole() {
467
+ const path = this.getPath();
468
+ const match = path.match(/^\/roles\/([a-z0-9\-]+)$/);
469
+ if (match === null) {
470
+ throw new errors_1.InvalidError(`Invalid role path: ${path}`);
471
+ }
472
+ const role_slug = match[1];
473
+ const desired_key = role_slug.replace(/-/g, '_');
474
+ const execution_context = this.getExecutionContext();
475
+ const { roles } = execution_context.getConfig();
476
+ const role_list = [];
477
+ let matching_role;
478
+ roles.forEach((role) => {
479
+ const role_key = (0, get_key_for_role_1.default)(role);
480
+ if (role_key === desired_key) {
481
+ matching_role = role;
482
+ }
483
+ const is_creator = role_key === default_role_1.default.CREATOR;
484
+ const is_unknown = role_key === default_role_1.default.UNKNOWN;
485
+ if (is_creator || is_unknown) {
486
+ return;
487
+ }
488
+ const role_url = (0, get_url_for_role_1.default)(role);
489
+ const { color } = role;
490
+ const role_label = `[${role.emoji} ${role.name}]`;
491
+ role_list.push(`- <a class="text-${color}" href="${role_url}">${role_label}</a>`);
492
+ });
493
+ if (matching_role === undefined) {
494
+ throw new errors_1.NotFoundError(`Unable to find role: ${desired_key}`);
495
+ }
496
+ const combined_roles = role_list.join('\n');
497
+ const { emoji, name, color } = matching_role;
498
+ const role_url = (0, get_url_for_role_1.default)(matching_role);
499
+ const role_label = `[${emoji} ${name}]`;
500
+ const plural_name = (0, grammar_1.pluralize)(name);
501
+ const group_label = `[${emoji} ${plural_name}]`;
502
+ const role_link = `<a class="text-${color}" href="${role_url}">${role_label}</a>`;
503
+ const group_link = `<a class="text-${color}" href="${role_url}">${group_label}</a>`;
504
+ const description = matching_role.description
505
+ .replace(/\[\$role\]/g, role_link)
506
+ .replace(/\[\$group\]/g, group_link);
507
+ return {
508
+ path,
509
+ folder: (0, folder_1.default)({
510
+ title: name,
511
+ emoji,
512
+ color
513
+ }),
514
+ blocks: [
515
+ (0, header_1.default)(role_label, {
516
+ color
517
+ }),
518
+ (0, note_1.default)(`All roles:\n\n${combined_roles}`),
519
+ (0, note_1.default)(description)
520
+ ]
521
+ };
522
+ }
357
523
  getCustomPageType() {
358
524
  const path = this.getPath();
359
525
  return (0, get_custom_page_type_for_path_1.default)(path);
@@ -361,15 +527,26 @@ class LoadPageOperation extends operation_1.default {
361
527
  getPath() {
362
528
  return this.path;
363
529
  }
364
- async loadCurrentRole() {
530
+ async buildRequestContext() {
365
531
  const execution_context = this.getExecutionContext();
366
532
  const operation = new load_account_1.default(execution_context);
367
533
  const account = await operation.perform();
534
+ const path = this.getPath();
368
535
  if (account === null) {
369
- return default_role_1.default.PUBLIC;
536
+ return {
537
+ path,
538
+ role: public_1.default,
539
+ username: 'anonymous'
540
+ };
370
541
  }
371
- const { role } = account;
372
- return role;
542
+ const { username, role_key } = account;
543
+ const roles = this.getRoles();
544
+ const role = (0, extract_role_1.default)(roles, role_key);
545
+ return {
546
+ path,
547
+ role,
548
+ username
549
+ };
373
550
  }
374
551
  getRoles() {
375
552
  const execution_context = this.getExecutionContext();