@fc3/mmcadi 0.1.0

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 (460) hide show
  1. package/LICENSE +673 -0
  2. package/README.md +5 -0
  3. package/bin/compile +63 -0
  4. package/bin/copy-static-files +13 -0
  5. package/bin/install +5 -0
  6. package/bin/precompile +55 -0
  7. package/bin/prepublish +7 -0
  8. package/bin/remap-paths +113 -0
  9. package/bin/test +9 -0
  10. package/config/tsconfig.json +37 -0
  11. package/package.json +33 -0
  12. package/src/bootstrap/start.ts +12 -0
  13. package/src/client/bootstrap.ts +5 -0
  14. package/src/client/client.ts +54 -0
  15. package/src/client/enum/key-code.ts +34 -0
  16. package/src/client/enum/page-type.ts +19 -0
  17. package/src/client/factory/page.ts +61 -0
  18. package/src/client/page/confirm-delete-block.ts +30 -0
  19. package/src/client/page/create-block.ts +6 -0
  20. package/src/client/page/day.ts +8 -0
  21. package/src/client/page/edit-block.ts +43 -0
  22. package/src/client/page/edit-custom.ts +16 -0
  23. package/src/client/page/home.ts +8 -0
  24. package/src/client/page/login.ts +8 -0
  25. package/src/client/page/logout.ts +8 -0
  26. package/src/client/page/month.ts +8 -0
  27. package/src/client/page/move-block.ts +8 -0
  28. package/src/client/page/select-block-type.ts +56 -0
  29. package/src/client/page/settings.ts +8 -0
  30. package/src/client/page/view-custom.ts +665 -0
  31. package/src/client/page/week.ts +8 -0
  32. package/src/client/page/year.ts +8 -0
  33. package/src/client/page.ts +128 -0
  34. package/src/client/shim/execute.ts +5 -0
  35. package/src/client/shim/logger.ts +44 -0
  36. package/src/client/utility/get-meta-value.ts +23 -0
  37. package/src/common/builder/block/background.ts +25 -0
  38. package/src/common/builder/block/folder.ts +43 -0
  39. package/src/common/builder/block/header.ts +15 -0
  40. package/src/common/builder/block/link.ts +32 -0
  41. package/src/common/builder/block/multicolumn.ts +16 -0
  42. package/src/common/builder/block/note.ts +13 -0
  43. package/src/common/builder/block/whitespace.ts +13 -0
  44. package/src/common/utility/get-parent-path.ts +29 -0
  45. package/src/constant/month-names.ts +16 -0
  46. package/src/enum/action-type.ts +11 -0
  47. package/src/enum/block-type.ts +18 -0
  48. package/src/enum/calendar-view-mode.ts +9 -0
  49. package/src/enum/color.ts +15 -0
  50. package/src/enum/default-role.ts +6 -0
  51. package/src/enum/directory-item-type.ts +6 -0
  52. package/src/enum/emoji.ts +94 -0
  53. package/src/enum/field-type.ts +8 -0
  54. package/src/enum/header-size.ts +7 -0
  55. package/src/enum/permission-type.ts +8 -0
  56. package/src/enum/time-place-visibility.ts +8 -0
  57. package/src/enum/tool-type.ts +14 -0
  58. package/src/index.ts +8 -0
  59. package/src/interface/hydration-callback.ts +7 -0
  60. package/src/interface/provider.ts +8 -0
  61. package/src/interface/repository.ts +12 -0
  62. package/src/lib/array/add.ts +10 -0
  63. package/src/lib/array/assert-is-empty.ts +23 -0
  64. package/src/lib/array/clone.ts +5 -0
  65. package/src/lib/array/difference.ts +8 -0
  66. package/src/lib/array/empty.ts +6 -0
  67. package/src/lib/array/equal.ts +24 -0
  68. package/src/lib/array/get-first-value.ts +5 -0
  69. package/src/lib/array/get-last-value.ts +5 -0
  70. package/src/lib/array/get-max-value.ts +5 -0
  71. package/src/lib/array/get-value-after.ts +23 -0
  72. package/src/lib/array/get-value-before.ts +23 -0
  73. package/src/lib/array/get-values-between.ts +18 -0
  74. package/src/lib/array/index.ts +5 -0
  75. package/src/lib/array/is-empty.ts +6 -0
  76. package/src/lib/array/remove.ts +19 -0
  77. package/src/lib/array/sum.ts +11 -0
  78. package/src/lib/array/unique.ts +13 -0
  79. package/src/lib/environment/bootstrap.ts +1 -0
  80. package/src/lib/environment/enum/environment-type.ts +8 -0
  81. package/src/lib/environment/enum/service-type.ts +5 -0
  82. package/src/lib/environment/index.ts +7 -0
  83. package/src/lib/environment/utility/get-environment-type.ts +28 -0
  84. package/src/lib/environment/utility/is-browser.ts +5 -0
  85. package/src/lib/environment/utility/is-development.ts +10 -0
  86. package/src/lib/environment/utility/is-production-or-staging.ts +8 -0
  87. package/src/lib/environment/utility/is-production.ts +10 -0
  88. package/src/lib/environment/utility/is-staging.ts +10 -0
  89. package/src/lib/errors/enum/error-type.ts +13 -0
  90. package/src/lib/errors/error/base.ts +40 -0
  91. package/src/lib/errors/error/conflict.ts +16 -0
  92. package/src/lib/errors/error/generic.ts +23 -0
  93. package/src/lib/errors/error/invalid.ts +14 -0
  94. package/src/lib/errors/error/invariant-violation.ts +5 -0
  95. package/src/lib/errors/error/not-allowed.ts +14 -0
  96. package/src/lib/errors/error/not-found.ts +16 -0
  97. package/src/lib/errors/error/not-implemented.ts +20 -0
  98. package/src/lib/errors/error/omitted.ts +14 -0
  99. package/src/lib/errors/error/timeout.ts +14 -0
  100. package/src/lib/errors/error/unauthorized.ts +14 -0
  101. package/src/lib/errors/index.ts +18 -0
  102. package/src/lib/errors/sugar/invariant.ts +7 -0
  103. package/src/lib/errors/type/coded-error.ts +7 -0
  104. package/src/lib/errors/type/error-data.ts +11 -0
  105. package/src/lib/errors/utility/create-error-for-error-type.ts +60 -0
  106. package/src/lib/errors/utility/create-error-from-ambiguous-json-data.ts +26 -0
  107. package/src/lib/errors/utility/error-matches.ts +28 -0
  108. package/src/lib/errors/utility/get-error-type-for-posix-error-code.ts +37 -0
  109. package/src/lib/errors/utility/get-error-type-for-status-code.ts +38 -0
  110. package/src/lib/errors/utility/get-message-for-error-type.ts +29 -0
  111. package/src/lib/errors/utility/matches-posix-error-code.ts +11 -0
  112. package/src/lib/errors/utility/wrap-error.ts +39 -0
  113. package/src/lib/event-emitter/index.ts +63 -0
  114. package/src/lib/execution-context/execution-context.ts +90 -0
  115. package/src/lib/execution-context/index.ts +8 -0
  116. package/src/lib/execution-context/type/session.ts +7 -0
  117. package/src/lib/feature/feature.ts +108 -0
  118. package/src/lib/feature/index.ts +3 -0
  119. package/src/lib/filesystem/bootstrap.ts +1 -0
  120. package/src/lib/filesystem/enum/file-extension.ts +19 -0
  121. package/src/lib/filesystem/index.ts +4 -0
  122. package/src/lib/filesystem/utility/exists.ts +21 -0
  123. package/src/lib/filesystem/utility/get-extension-for-filepath.ts +20 -0
  124. package/src/lib/filesystem/utility/strip-extension.ts +26 -0
  125. package/src/lib/grammar/index.ts +3 -0
  126. package/src/lib/grammar/noun-inflector.ts +104 -0
  127. package/src/lib/grammar/utility/get-words-from-identifier.ts +9 -0
  128. package/src/lib/grammar/verb-inflector.ts +344 -0
  129. package/src/lib/http/buffer-stream.ts +76 -0
  130. package/src/lib/http/enum/content-type.ts +19 -0
  131. package/src/lib/http/enum/cookie-attribute.ts +11 -0
  132. package/src/lib/http/enum/header.ts +29 -0
  133. package/src/lib/http/enum/method.ts +11 -0
  134. package/src/lib/http/enum/same-site-policy.ts +7 -0
  135. package/src/lib/http/enum/status-code.ts +9 -0
  136. package/src/lib/http/factory/body-parser.ts +55 -0
  137. package/src/lib/http/index.ts +24 -0
  138. package/src/lib/http/interface/client-request.ts +15 -0
  139. package/src/lib/http/interface/incoming-message.ts +24 -0
  140. package/src/lib/http/interface/network-library.ts +9 -0
  141. package/src/lib/http/interface/request-callback.ts +7 -0
  142. package/src/lib/http/isomorphic/request.ts +77 -0
  143. package/src/lib/http/isomorphic/response.ts +77 -0
  144. package/src/lib/http/isomorphic.ts +20 -0
  145. package/src/lib/http/parser/accept-header.ts +35 -0
  146. package/src/lib/http/parser/basic-auth-header.ts +48 -0
  147. package/src/lib/http/parser/body/json.ts +14 -0
  148. package/src/lib/http/parser/body/multipart.ts +89 -0
  149. package/src/lib/http/parser/body/url-encoded.ts +16 -0
  150. package/src/lib/http/parser/body.ts +44 -0
  151. package/src/lib/http/parser/cookie.ts +114 -0
  152. package/src/lib/http/parser/querystring.ts +92 -0
  153. package/src/lib/http/parser/url.ts +76 -0
  154. package/src/lib/http/request/incoming.ts +299 -0
  155. package/src/lib/http/request/outgoing.ts +276 -0
  156. package/src/lib/http/request.ts +26 -0
  157. package/src/lib/http/response/incoming.ts +243 -0
  158. package/src/lib/http/response/outgoing.ts +160 -0
  159. package/src/lib/http/response.ts +74 -0
  160. package/src/lib/http/serializer/basic-auth-header.ts +27 -0
  161. package/src/lib/http/serializer/cookie.ts +90 -0
  162. package/src/lib/http/serializer/query-data.ts +54 -0
  163. package/src/lib/http/transaction.ts +320 -0
  164. package/src/lib/http/type/basic-auth-credentials.ts +6 -0
  165. package/src/lib/http/type/header-map.ts +5 -0
  166. package/src/lib/http/type/log-attributes.ts +12 -0
  167. package/src/lib/http/type/path-parameters.ts +5 -0
  168. package/src/lib/http/type/query-data.ts +7 -0
  169. package/src/lib/http/type/query-value.ts +11 -0
  170. package/src/lib/http/type/request-options.ts +16 -0
  171. package/src/lib/http/type/transaction-data.ts +4 -0
  172. package/src/lib/http/utility/get-content-type-for-extension.ts +47 -0
  173. package/src/lib/http/utility/get-library-for-protocol.ts +25 -0
  174. package/src/lib/http/utility/get-status-code-for-error-type.ts +37 -0
  175. package/src/lib/http/utility/get-status-code-for-error.ts +13 -0
  176. package/src/lib/http/utility/is-client-error-status.ts +15 -0
  177. package/src/lib/http/utility/is-error-status.ts +9 -0
  178. package/src/lib/http/utility/is-server-error-status.ts +7 -0
  179. package/src/lib/http/utility/is-success-status.ts +7 -0
  180. package/src/lib/http/utility/proxy-request.ts +58 -0
  181. package/src/lib/http/utility/serialize-request-options.ts +9 -0
  182. package/src/lib/http/utility/slug-generator.ts +20 -0
  183. package/src/lib/key-generator/index.ts +3 -0
  184. package/src/lib/key-generator/key-generator.ts +7 -0
  185. package/src/lib/logger/enum/ansi-escape-code.ts +14 -0
  186. package/src/lib/logger/enum/log-level.ts +8 -0
  187. package/src/lib/logger/formatter.ts +59 -0
  188. package/src/lib/logger/index.ts +7 -0
  189. package/src/lib/logger/interface/error-reporter.ts +7 -0
  190. package/src/lib/logger/interface/logger.ts +13 -0
  191. package/src/lib/logger/logger.ts +239 -0
  192. package/src/lib/logger/type/error-parameters.ts +9 -0
  193. package/src/lib/logger/type/loggable-data.ts +5 -0
  194. package/src/lib/logger/type/loggable-value.ts +1 -0
  195. package/src/lib/metrics/dispatcher.ts +264 -0
  196. package/src/lib/metrics/enum/dispatch-mode.ts +6 -0
  197. package/src/lib/metrics/index.ts +2 -0
  198. package/src/lib/metrics/settings-hydrator.ts +51 -0
  199. package/src/lib/metrics/type/dispatcher-settings.ts +12 -0
  200. package/src/lib/metrics/type/tag-map.ts +5 -0
  201. package/src/lib/network/bootstrap.ts +1 -0
  202. package/src/lib/network/enum/connection-status.ts +14 -0
  203. package/src/lib/network/enum/http-status-code.ts +75 -0
  204. package/src/lib/network/enum/network-protocol.ts +10 -0
  205. package/src/lib/network/event-emitter.ts +63 -0
  206. package/src/lib/network/index.ts +7 -0
  207. package/src/lib/network/interface/socket.ts +42 -0
  208. package/src/lib/network/type/socket-options.ts +6 -0
  209. package/src/lib/network/utility/get-protocol-from-url.ts +15 -0
  210. package/src/lib/operation/index.ts +6 -0
  211. package/src/lib/operation/operation/auto-logging.ts +94 -0
  212. package/src/lib/operation/operation/silent.ts +17 -0
  213. package/src/lib/operation/operation.ts +80 -0
  214. package/src/lib/process/bootstrap.ts +1 -0
  215. package/src/lib/process/enum/posix-error-code.ts +138 -0
  216. package/src/lib/process/enum/process-signal.ts +68 -0
  217. package/src/lib/process/error.ts +6 -0
  218. package/src/lib/process/execute.ts +77 -0
  219. package/src/lib/process/index.ts +4 -0
  220. package/src/lib/process/type/command-options.ts +9 -0
  221. package/src/lib/process/utility/bind-process-lifespan-to.ts +10 -0
  222. package/src/lib/promise-wrapper/index.ts +3 -0
  223. package/src/lib/promise-wrapper/promise-wrapper.ts +51 -0
  224. package/src/lib/random/chance.ts +5 -0
  225. package/src/lib/random/element.ts +7 -0
  226. package/src/lib/random/elements.ts +12 -0
  227. package/src/lib/random/enum.ts +34 -0
  228. package/src/lib/random/enums.ts +11 -0
  229. package/src/lib/random/index.ts +3 -0
  230. package/src/lib/random/number.ts +8 -0
  231. package/src/lib/server/base.ts +194 -0
  232. package/src/lib/server/enum/server-event.ts +5 -0
  233. package/src/lib/server/enum/server-status.ts +10 -0
  234. package/src/lib/server/http/endpoint/ping.ts +21 -0
  235. package/src/lib/server/http/endpoint.ts +345 -0
  236. package/src/lib/server/http/interface/endpoint-constructor.ts +12 -0
  237. package/src/lib/server/http/interface/result-serializer.ts +5 -0
  238. package/src/lib/server/http/middleware.ts +18 -0
  239. package/src/lib/server/http/result-serializer/html.ts +92 -0
  240. package/src/lib/server/http/result-serializer/json.ts +23 -0
  241. package/src/lib/server/http/route.ts +104 -0
  242. package/src/lib/server/http/router.ts +125 -0
  243. package/src/lib/server/http/type/session-resolver.ts +8 -0
  244. package/src/lib/server/http/utility/create-server.ts +34 -0
  245. package/src/lib/server/http/utility/path-parser.ts +49 -0
  246. package/src/lib/server/http/utility/standardize-html-indentation.ts +54 -0
  247. package/src/lib/server/http/websocket-wrapper.ts +83 -0
  248. package/src/lib/server/http.ts +301 -0
  249. package/src/lib/server/index.ts +5 -0
  250. package/src/lib/server/tcp.ts +53 -0
  251. package/src/lib/server/type/server-options.ts +10 -0
  252. package/src/lib/string/calculate-length.ts +17 -0
  253. package/src/lib/string/capitalize.ts +8 -0
  254. package/src/lib/string/create-slug.ts +14 -0
  255. package/src/lib/string/enum/ansi-escape-code.ts +14 -0
  256. package/src/lib/string/enum/string-encoding.ts +9 -0
  257. package/src/lib/string/hyphenate.ts +5 -0
  258. package/src/lib/string/index.ts +3 -0
  259. package/src/lib/string/pad.ts +14 -0
  260. package/src/lib/string/trim-multiline.ts +21 -0
  261. package/src/lib/string/trim.ts +8 -0
  262. package/src/lib/tcp/channel.ts +13 -0
  263. package/src/lib/tcp/connection/incoming.ts +72 -0
  264. package/src/lib/tcp/connection/outgoing.ts +219 -0
  265. package/src/lib/tcp/connection.ts +360 -0
  266. package/src/lib/tcp/enum/connection-event.ts +12 -0
  267. package/src/lib/tcp/enum/message-type.ts +9 -0
  268. package/src/lib/tcp/index.ts +1 -0
  269. package/src/lib/tcp/type/connection-parameters.ts +6 -0
  270. package/src/lib/tcp/type/message/channel-close.ts +9 -0
  271. package/src/lib/tcp/type/message/channel-open.ts +9 -0
  272. package/src/lib/tcp/type/message.ts +10 -0
  273. package/src/lib/test/index.ts +2 -0
  274. package/src/lib/test/utility/build-config.ts +17 -0
  275. package/src/lib/test/utility/build-execution-context.ts +11 -0
  276. package/src/lib/time/bootstrap.ts +1 -0
  277. package/src/lib/time/enum/time-interval.ts +12 -0
  278. package/src/lib/time/index.ts +4 -0
  279. package/src/lib/time/utility/format-duration.ts +139 -0
  280. package/src/lib/time/utility/format-relative-duration.ts +22 -0
  281. package/src/lib/time/utility/sleep.ts +9 -0
  282. package/src/operation.ts +18 -0
  283. package/src/server/endpoint/abstract-page.ts +126 -0
  284. package/src/server/endpoint/action/create.ts +545 -0
  285. package/src/server/endpoint/action/get.ts +231 -0
  286. package/src/server/endpoint/base.ts +51 -0
  287. package/src/server/endpoint/day.ts +13 -0
  288. package/src/server/endpoint/generic-page.ts +14 -0
  289. package/src/server/endpoint/index.ts +11 -0
  290. package/src/server/endpoint/login.ts +45 -0
  291. package/src/server/endpoint/logout.ts +38 -0
  292. package/src/server/endpoint/month.ts +35 -0
  293. package/src/server/endpoint/robots.ts +18 -0
  294. package/src/server/endpoint/session/create.ts +62 -0
  295. package/src/server/endpoint/settings/get.ts +40 -0
  296. package/src/server/endpoint/settings/update.ts +44 -0
  297. package/src/server/endpoint/today.ts +15 -0
  298. package/src/server/endpoint/week.ts +34 -0
  299. package/src/server/endpoint/year.ts +34 -0
  300. package/src/server/enum/custom-page-type.ts +10 -0
  301. package/src/server/factory/block-result-serializer.ts +115 -0
  302. package/src/server/middleware/base.ts +6 -0
  303. package/src/server/middleware/error-handler.ts +177 -0
  304. package/src/server/middleware/static-file.ts +83 -0
  305. package/src/server/operation/add-block.ts +110 -0
  306. package/src/server/operation/create-session.ts +43 -0
  307. package/src/server/operation/delete-block.ts +96 -0
  308. package/src/server/operation/demote-block.ts +108 -0
  309. package/src/server/operation/destroy-session.ts +26 -0
  310. package/src/server/operation/load-account.ts +30 -0
  311. package/src/server/operation/load-block.ts +48 -0
  312. package/src/server/operation/load-directory-items.ts +75 -0
  313. package/src/server/operation/load-page.ts +368 -0
  314. package/src/server/operation/promote-block.ts +104 -0
  315. package/src/server/operation/save-page.ts +60 -0
  316. package/src/server/operation/update-account-settings.ts +52 -0
  317. package/src/server/operation/update-block.ts +124 -0
  318. package/src/server/repository/memory.ts +112 -0
  319. package/src/server/result-serializer/action.ts +939 -0
  320. package/src/server/result-serializer/base.ts +1267 -0
  321. package/src/server/result-serializer/block/audio.ts +33 -0
  322. package/src/server/result-serializer/block/background.ts +20 -0
  323. package/src/server/result-serializer/block/calendar.ts +148 -0
  324. package/src/server/result-serializer/block/directory.ts +57 -0
  325. package/src/server/result-serializer/block/ephemeral.ts +14 -0
  326. package/src/server/result-serializer/block/folder.ts +106 -0
  327. package/src/server/result-serializer/block/header.ts +31 -0
  328. package/src/server/result-serializer/block/image.ts +46 -0
  329. package/src/server/result-serializer/block/link.ts +40 -0
  330. package/src/server/result-serializer/block/list.ts +140 -0
  331. package/src/server/result-serializer/block/multi-column.ts +97 -0
  332. package/src/server/result-serializer/block/note.ts +44 -0
  333. package/src/server/result-serializer/block/todo.ts +78 -0
  334. package/src/server/result-serializer/block/whitespace.ts +15 -0
  335. package/src/server/result-serializer/block.ts +248 -0
  336. package/src/server/result-serializer/common/time-place-options.ts +33 -0
  337. package/src/server/result-serializer/login.ts +58 -0
  338. package/src/server/result-serializer/month.ts +170 -0
  339. package/src/server/result-serializer/page.ts +548 -0
  340. package/src/server/result-serializer/settings.ts +85 -0
  341. package/src/server/result-serializer/week.ts +195 -0
  342. package/src/server/result-serializer/year.ts +160 -0
  343. package/src/server/utility/accepts-content-type.ts +16 -0
  344. package/src/server/utility/accepts-html.ts +9 -0
  345. package/src/server/utility/accepts-json.ts +9 -0
  346. package/src/server/utility/add-days.ts +11 -0
  347. package/src/server/utility/create-date.ts +23 -0
  348. package/src/server/utility/create-index-path.ts +5 -0
  349. package/src/server/utility/create-slug.ts +9 -0
  350. package/src/server/utility/create-toast-path.ts +19 -0
  351. package/src/server/utility/date-less-than.ts +5 -0
  352. package/src/server/utility/date-occurs-before.ts +22 -0
  353. package/src/server/utility/date-to-key.ts +7 -0
  354. package/src/server/utility/date-to-label.ts +5 -0
  355. package/src/server/utility/date-to-path.ts +9 -0
  356. package/src/server/utility/dates-are-equal.ts +22 -0
  357. package/src/server/utility/dates-are-in-order.ts +9 -0
  358. package/src/server/utility/dates-are-on-the-same-day.ts +9 -0
  359. package/src/server/utility/dates-in-same-month.ts +8 -0
  360. package/src/server/utility/day-to-date.ts +40 -0
  361. package/src/server/utility/decrement-date.ts +11 -0
  362. package/src/server/utility/get-block-at-index-path.ts +32 -0
  363. package/src/server/utility/get-block-permissions.ts +15 -0
  364. package/src/server/utility/get-compact-label-for-date.ts +8 -0
  365. package/src/server/utility/get-custom-page-type-for-path.ts +37 -0
  366. package/src/server/utility/get-element-id-for-block.ts +15 -0
  367. package/src/server/utility/get-emoji-for-block-type.ts +39 -0
  368. package/src/server/utility/get-emoji-for-tool-type.ts +20 -0
  369. package/src/server/utility/get-end-of-month.ts +13 -0
  370. package/src/server/utility/get-end-of-week.ts +13 -0
  371. package/src/server/utility/get-filepath-for-folder-block.ts +23 -0
  372. package/src/server/utility/get-hex-for-color.ts +31 -0
  373. package/src/server/utility/get-label-for-time-place-visibility.ts +23 -0
  374. package/src/server/utility/get-month-name.ts +18 -0
  375. package/src/server/utility/get-next-day.ts +7 -0
  376. package/src/server/utility/get-next-month.ts +12 -0
  377. package/src/server/utility/get-next-week.ts +12 -0
  378. package/src/server/utility/get-next-year.ts +13 -0
  379. package/src/server/utility/get-ordinal-label-for-week.ts +11 -0
  380. package/src/server/utility/get-ordinal-of-week-within-month.ts +15 -0
  381. package/src/server/utility/get-padded-date.ts +11 -0
  382. package/src/server/utility/get-parent-index-path.ts +18 -0
  383. package/src/server/utility/get-path-for-folder-block.ts +25 -0
  384. package/src/server/utility/get-path-from-url.ts +13 -0
  385. package/src/server/utility/get-previous-index-path.ts +27 -0
  386. package/src/server/utility/get-previous-month.ts +12 -0
  387. package/src/server/utility/get-previous-week.ts +11 -0
  388. package/src/server/utility/get-previous-year.ts +13 -0
  389. package/src/server/utility/get-random-emoji-for-date.ts +109 -0
  390. package/src/server/utility/get-short-label-for-date.ts +11 -0
  391. package/src/server/utility/get-short-month-name.ts +9 -0
  392. package/src/server/utility/get-short-ordinal.ts +26 -0
  393. package/src/server/utility/get-siblings-and-index-for-index-path.ts +67 -0
  394. package/src/server/utility/get-start-of-month.ts +11 -0
  395. package/src/server/utility/get-start-of-week.ts +12 -0
  396. package/src/server/utility/get-start-of-year.ts +12 -0
  397. package/src/server/utility/get-weekday-name.ts +24 -0
  398. package/src/server/utility/increment-date.ts +15 -0
  399. package/src/server/utility/is-index-path.ts +5 -0
  400. package/src/server/utility/key-to-date.ts +25 -0
  401. package/src/server/utility/month-has-week-containing-date.ts +13 -0
  402. package/src/server/utility/month-to-date.ts +28 -0
  403. package/src/server/utility/month-to-path.ts +10 -0
  404. package/src/server/utility/months-are-equal.ts +8 -0
  405. package/src/server/utility/parse-index-path.ts +23 -0
  406. package/src/server/utility/path-is-date.ts +13 -0
  407. package/src/server/utility/path-to-date.ts +24 -0
  408. package/src/server/utility/subtract-days.ts +7 -0
  409. package/src/server/utility/validate-month.ts +10 -0
  410. package/src/server/utility/validate-page.ts +46 -0
  411. package/src/server/utility/validate-path.ts +9 -0
  412. package/src/server/utility/validate-url.ts +12 -0
  413. package/src/server/utility/week-greater-than.ts +10 -0
  414. package/src/server/utility/week-to-date.ts +8 -0
  415. package/src/server/utility/week-to-path.ts +12 -0
  416. package/src/server/utility/weeks-are-equal.ts +8 -0
  417. package/src/server/utility/year-to-date.ts +26 -0
  418. package/src/server/utility/year-to-path.ts +7 -0
  419. package/src/server/utility/years-are-equal.ts +8 -0
  420. package/src/server.ts +140 -0
  421. package/src/test.ts +195 -0
  422. package/src/type/account-settings.ts +9 -0
  423. package/src/type/account.ts +11 -0
  424. package/src/type/action/add-block.ts +74 -0
  425. package/src/type/action/complete-block.ts +10 -0
  426. package/src/type/action/delete-block.ts +11 -0
  427. package/src/type/action/demote-block.ts +9 -0
  428. package/src/type/action/edit-block.ts +11 -0
  429. package/src/type/action/promote-block.ts +9 -0
  430. package/src/type/action.ts +9 -0
  431. package/src/type/block/audio.ts +8 -0
  432. package/src/type/block/background.ts +10 -0
  433. package/src/type/block/directory.ts +18 -0
  434. package/src/type/block/ephemeral.ts +9 -0
  435. package/src/type/block/folder.ts +14 -0
  436. package/src/type/block/header.ts +11 -0
  437. package/src/type/block/image.ts +8 -0
  438. package/src/type/block/link.ts +12 -0
  439. package/src/type/block/list.ts +24 -0
  440. package/src/type/block/multi-column.ts +10 -0
  441. package/src/type/block/note.ts +9 -0
  442. package/src/type/block/todo.ts +10 -0
  443. package/src/type/block/whitespace.ts +9 -0
  444. package/src/type/block-metadata.ts +14 -0
  445. package/src/type/block.ts +18 -0
  446. package/src/type/day.ts +5 -0
  447. package/src/type/field-definition.ts +8 -0
  448. package/src/type/field-value.ts +5 -0
  449. package/src/type/file.ts +6 -0
  450. package/src/type/month.ts +5 -0
  451. package/src/type/page.ts +8 -0
  452. package/src/type/price.ts +11 -0
  453. package/src/type/resource.ts +5 -0
  454. package/src/type/runtime-config.ts +13 -0
  455. package/src/type/server-settings.ts +17 -0
  456. package/src/type/toast.ts +8 -0
  457. package/src/type/week.ts +5 -0
  458. package/src/type/year.ts +5 -0
  459. package/test/unit/index.ts +11 -0
  460. package/test/unit/server/operation/promote-block.ts +84 -0
@@ -0,0 +1,1267 @@
1
+ import {readFileSync} from 'fs';
2
+
3
+ import {HtmlResultSerializer} from 'lib/server';
4
+ import {StringEncoding} from 'lib/string';
5
+ import {Session} from 'lib/execution-context';
6
+ import {InvariantViolation} from 'lib/errors';
7
+
8
+ import Emoji from 'enum/emoji';
9
+ import Color from 'enum/color';
10
+ import getPathFromUrl from 'server/utility/get-path-from-url';
11
+ import PageType from 'client/enum/page-type';
12
+ import getHexForColor from 'server/utility/get-hex-for-color';
13
+ import createToastPath from 'server/utility/create-toast-path';
14
+
15
+ abstract class BaseResultSerializer<T extends object> extends HtmlResultSerializer<T> {
16
+ private session: Session;
17
+ private path: string;
18
+ private referrer_url: string;
19
+ private cached_client_bundle: string | undefined;
20
+
21
+ public constructor(
22
+ result: T,
23
+ path: string,
24
+ referrer_url: string,
25
+ session: Session
26
+ ) {
27
+ super(result);
28
+
29
+ this.path = path;
30
+ this.referrer_url = referrer_url;
31
+ this.session = session;
32
+ }
33
+
34
+ protected getSession(): Session {
35
+ return this.session;
36
+ }
37
+
38
+ public serializeContent(): string {
39
+ const css = this.serializeCss();
40
+ const header = this.serializeHeader();
41
+ const main = this.serializeMain();
42
+ const footer = this.serializeFooter();
43
+ const js = this.serializeJs();
44
+
45
+ return `
46
+ ${css}
47
+ ${header}
48
+ ${main}
49
+ ${footer}
50
+ ${js}
51
+ `;
52
+ }
53
+
54
+ // Override on child classes. Basically just the Page serializer.
55
+ protected isHome(): boolean {
56
+ return false;
57
+ }
58
+
59
+ // Override on child classes. Basically just the Page serializer.
60
+ protected isToday(): boolean {
61
+ return false;
62
+ }
63
+
64
+ protected isLoggedIn(): boolean {
65
+ const {account_id} = this.getSession();
66
+
67
+ return account_id !== null;
68
+ }
69
+
70
+ protected getUsername(): string | null {
71
+ const {username} = this.getSession();
72
+
73
+ return username;
74
+ }
75
+
76
+ protected getMetaMappings(): Record<string, string | number | boolean> {
77
+ const page_type = this.getPageType();
78
+ const logged_in = this.isLoggedIn();
79
+
80
+ return {
81
+ page_type,
82
+ logged_in
83
+ };
84
+ }
85
+
86
+ protected serializeHeader(): string {
87
+ return '';
88
+ }
89
+
90
+ protected serializeFooter(): string {
91
+ const home_link = (() => {
92
+ if (this.isHome()) {
93
+ return '';
94
+ }
95
+
96
+ const path = createToastPath('/', {
97
+ message: `${Emoji.HOUSE} home ${Emoji.HOUSE}`,
98
+ color: Color.BLUE
99
+ });
100
+
101
+ return `<a href="${path}">${Emoji.LEFT_ARROW_UNICODE} home</a>`;
102
+ })();
103
+
104
+ const today_link = (() => {
105
+ if (this.isToday()) {
106
+ return '';
107
+ }
108
+
109
+ const path = createToastPath('/today', {
110
+ message: `${Emoji.SUNSHINE} today ${Emoji.SUNSHINE}`,
111
+ color: Color.YELLOW
112
+ });
113
+
114
+ return `<a href="${path}">today</a>`;
115
+ })();
116
+
117
+ const referrer_url = this.getReferrerUrl();
118
+ const referrer_path = getPathFromUrl(referrer_url);
119
+ const source_path = encodeURIComponent(referrer_path);
120
+
121
+ const login_link = (() => {
122
+ if (this.isLoggedIn()) {
123
+ return `<a href="/logout?source=${source_path}">log out ${Emoji.RIGHT_ARROW_UNICODE}</a>`;
124
+ } else {
125
+ return `<a href="/login?source=${source_path}">log in ${Emoji.RIGHT_ARROW_UNICODE}</a>`;
126
+ }
127
+ })();
128
+
129
+ return `
130
+ <footer>
131
+ <div class="section-wrapper">
132
+ <section class="transparent">
133
+ <table class="fixed">
134
+ <tbody>
135
+ <tr>
136
+ <td class="align-left">
137
+ ${home_link}
138
+ </td>
139
+ <td>
140
+ ${today_link}
141
+ </td>
142
+ <td class="align-right">
143
+ ${login_link}
144
+ </td>
145
+ </tr>
146
+ </tbody>
147
+ </table>
148
+ </section>
149
+ </div>
150
+ </footer>
151
+ `;
152
+ }
153
+
154
+ protected serializeMain(): string {
155
+ const sections = this.serializeSections();
156
+ const breadcrumbs = this.serializeBreadcrumbs();
157
+
158
+ return `
159
+ <main>
160
+ <div class="section-wrapper">
161
+ ${breadcrumbs}
162
+ ${sections}
163
+ </div>
164
+ </main>
165
+ `;
166
+ }
167
+
168
+ // Override this as needed on child classes.
169
+ protected serializeBreadcrumbs(): string {
170
+ return '';
171
+ }
172
+
173
+ // Override this as needed on child classes.
174
+ protected serializeJs(): string {
175
+ if (this.cached_client_bundle === undefined) {
176
+ this.cached_client_bundle = this.initClientBundle();
177
+ }
178
+
179
+ return this.cached_client_bundle;
180
+ }
181
+
182
+ private initClientBundle(): string {
183
+ const match = __dirname.match(/^(.*?\/dist)/);
184
+
185
+ if (match === null) {
186
+ throw new InvariantViolation(`
187
+ Tried to read project dist path,
188
+ but current script was not located within it
189
+ `);
190
+ }
191
+
192
+ const dist_path = match[1];
193
+ const filepath = `${dist_path}/client.js`;
194
+ const contents = readFileSync(filepath, StringEncoding.UTF8);
195
+
196
+ return `
197
+ <script>
198
+ ${contents}
199
+ </script>
200
+ `;
201
+ }
202
+
203
+ private serializeUtilityCss(): string {
204
+ const aspects = ['margin', 'padding'];
205
+ const sizes = [0, 2, 4, 8, 16, 32, 48, 64];
206
+ const sides = ['top', 'bottom', 'left', 'right'];
207
+ const rules: string[] = [];
208
+
209
+ aspects.forEach((aspect) => {
210
+ const aspect_shorthand = aspect.slice(0, 1);
211
+
212
+ sizes.forEach((size) => {
213
+ const classname = `${aspect_shorthand}-${size}`;
214
+ const rule = `.${classname} { ${aspect}: ${size}px !important; }`;
215
+
216
+ rules.push(rule);
217
+ });
218
+
219
+ sides.forEach((side) => {
220
+ const side_shorthand = side.slice(0, 1);
221
+
222
+ sizes.forEach((size) => {
223
+ const classname = `${aspect_shorthand}${side_shorthand}-${size}`;
224
+ const property = `${aspect}-${side}`;
225
+ const rule = `.${classname} { ${property}: ${size}px !important; }`;
226
+
227
+ rules.push(rule);
228
+ });
229
+ });
230
+ });
231
+
232
+ return `
233
+ <style>
234
+ ${rules.join('\n\t\t\t\t')}
235
+
236
+ .quarter-opacity {
237
+ opacity: 0.25 !important;
238
+ }
239
+
240
+ .half-opacity {
241
+ opacity: 0.5 !important;
242
+ }
243
+
244
+ .three-quarter-opacity {
245
+ opacity: 75% !important;
246
+ }
247
+
248
+ .float-right {
249
+ float: right !important;
250
+ }
251
+
252
+ .no-background {
253
+ background: none !important;
254
+ }
255
+
256
+ .invisible {
257
+ visibility: hidden !important;
258
+ }
259
+
260
+ .align-top {
261
+ vertical-align: top !important;
262
+ }
263
+
264
+ .align-bottom {
265
+ vertical-align: bottom !important;
266
+ }
267
+
268
+ .align-left {
269
+ text-align: left !important;
270
+ }
271
+
272
+ .align-right {
273
+ text-align: right !important;
274
+ }
275
+
276
+ .centered {
277
+ text-align: center !important;
278
+ }
279
+
280
+ .hidden {
281
+ display: none !important;
282
+ }
283
+
284
+ .text-bold {
285
+ font-weight: bold;
286
+ }
287
+
288
+ .text-smaller {
289
+ font-size: 75% !important;
290
+ }
291
+
292
+ .text-very-large {
293
+ font-size: 150% !important;
294
+ }
295
+
296
+ .text-yellow {
297
+ color: #FC3 !important;
298
+ }
299
+
300
+ .fuschia-border {
301
+ border-color: #F36 !important;
302
+ }
303
+
304
+ .maroon-border {
305
+ border-color: #603 !important;
306
+ }
307
+
308
+ .nowrap {
309
+ white-space: nowrap !important;
310
+ }
311
+
312
+ .wrap {
313
+ white-space: wrap !important;
314
+ }
315
+
316
+ .border-none {
317
+ border: none !important;
318
+ }
319
+ </style>
320
+ `;
321
+ }
322
+
323
+ protected serializeCss(): string {
324
+ const utility_css = this.serializeUtilityCss();
325
+
326
+ const biglink_color_classes = Object.values(Color).map((color) => {
327
+ const hex = getHexForColor(color);
328
+
329
+ if (hex.length !== 4) {
330
+ throw new InvariantViolation(`
331
+ Expected 3-character hex code,
332
+ but got: ${hex}
333
+ `);
334
+ }
335
+
336
+ const raw_r = hex[1];
337
+ const raw_g = hex[2];
338
+ const raw_b = hex[3];
339
+ const r = parseInt(`${raw_r}${raw_r}`, 16);
340
+ const g = parseInt(`${raw_g}${raw_g}`, 16);
341
+ const b = parseInt(`${raw_b}${raw_b}`, 16);
342
+
343
+ return `
344
+ .biglink.${color} {
345
+ background-image: repeating-linear-gradient(
346
+ -45deg,
347
+ rgba(${r}, ${g}, ${b}, 0.25),
348
+ rgba(${r}, ${g}, ${b}, 0.25) 10px,
349
+ #111 10px,
350
+ #111 20px
351
+ );
352
+
353
+ animation: stripes 4s linear infinite;
354
+ background-size: 200% 200%;
355
+ border-color: ${hex};
356
+ color: ${hex};
357
+ }
358
+
359
+ .biglink.${color}:hover,
360
+ .block.selected > .biglink.${color} {
361
+ background: rgba(${r}, ${g}, ${b}, 1);
362
+ }
363
+ `;
364
+ });
365
+
366
+ return `
367
+ <style>
368
+ body {
369
+ font-size: 24px;
370
+ font-family: monospace;
371
+ margin: 0 auto;
372
+ overflow-x: hidden;
373
+ color: #FFF;
374
+ }
375
+
376
+ header {
377
+ border-bottom: 4px solid rgba(255, 255, 255, 0.25);
378
+ position: sticky;
379
+ top: 0;
380
+ left: 0;
381
+ right: 0;
382
+ z-index: 1;
383
+ }
384
+
385
+ footer {
386
+ border-top: 4px solid rgba(255, 255, 255, 0.25);
387
+ }
388
+
389
+ header, footer {
390
+ padding: 16px 0px;
391
+ }
392
+
393
+ body, header {
394
+ background-image: url('data:image/svg+xml;utf8,` +
395
+ `<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">` +
396
+ `<rect width="64" height="64" fill="black"/>` +
397
+ `<polygon points="0,0 7,0 0,7" fill="%23222" />` +
398
+ `<polygon points="57,64 64,57 64,64" fill="%23222" />` +
399
+ `<polygon points="0,57 57,0 64,0 64,7 7,64 0,64" fill="%23222" />` +
400
+ `<polygon points="0,25 25,0 39,0 0,39" fill="%23222" />` +
401
+ `<polygon points="25,64 64,25 64,39 39,64" fill="%23222" />` +
402
+ `</svg>');
403
+ }
404
+
405
+ body.editing, body.editing header {
406
+ background-image: url('data:image/svg+xml;utf8,` +
407
+ `<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">` +
408
+ `<rect width="64" height="64" fill="black"/>` +
409
+ `<polygon points="0,0 7,0 0,7" fill="%23786400" />` +
410
+ `<polygon points="57,64 64,57 64,64" fill="%23786400" />` +
411
+ `<polygon points="0,57 57,0 64,0 64,7 7,64 0,64" fill="%23786400" />` +
412
+ `<polygon points="0,25 25,0 39,0 0,39" fill="%23786400" />` +
413
+ `<polygon points="25,64 64,25 64,39 39,64" fill="%23786400" />` +
414
+ `</svg>');
415
+ }
416
+
417
+ main {
418
+ padding: 16px 0px;
419
+ margin: 0 auto;
420
+ background: #111;
421
+ }
422
+
423
+ body.editing main {
424
+ }
425
+
426
+ ul {
427
+ list-style: none;
428
+ margin: 0;
429
+ padding: 0;
430
+ }
431
+
432
+ a {
433
+ color: #09F;
434
+ }
435
+
436
+ p:first-child {
437
+ margin-top: 0;
438
+ }
439
+
440
+ p:last-child {
441
+ margin-bottom: 0;
442
+ }
443
+
444
+ button {
445
+ all: unset;
446
+ cursor: pointer;
447
+ }
448
+
449
+ section {
450
+ border: 4px solid #333;
451
+ color: #FFF;
452
+ padding: 16px;
453
+ margin: 0 auto;
454
+ margin-bottom: 8px;
455
+ background: rgba(0, 0, 0, 0.75);
456
+ box-sizing: border-box;
457
+ position: relative;
458
+ text-align: left;
459
+ }
460
+
461
+ section.condensed {
462
+ padding: 0px;
463
+ border: none;
464
+ background: none;
465
+ }
466
+
467
+ section.block.condensed.link {
468
+ background: rgba(0, 0, 0, 0.75);
469
+ }
470
+
471
+ .section-wrapper {
472
+ max-width: 720px;
473
+ margin: 0 auto;
474
+ }
475
+
476
+ section::after, .clearfix::after {
477
+ content: "";
478
+ display: table;
479
+ clear: both;
480
+ }
481
+
482
+ section.transparent {
483
+ background: transparent;
484
+ border: 4px solid transparent;
485
+ color: #FFF;
486
+ }
487
+
488
+ section.editing {
489
+ min-height: 104px;
490
+ margin-left: 52px;
491
+ margin-right: 52px;
492
+ }
493
+
494
+ section nav {
495
+ display: none;
496
+ position: absolute;
497
+ width: 48px;
498
+ top: 0;
499
+ bottom: 0;
500
+ }
501
+
502
+ section nav.left {
503
+ left: -52px;
504
+ }
505
+
506
+ section nav.right {
507
+ right: -52px;
508
+ }
509
+
510
+ section nav .biglink {
511
+ width: 48px;
512
+ height: 48px;
513
+ color: #FFF;
514
+ line-height: 43px;
515
+ font-size: 32px;
516
+ text-align: center;
517
+ box-sizing: border-box;
518
+ padding: 0;
519
+ border-color: transparent;
520
+ }
521
+
522
+ section.editing nav {
523
+ display: block;
524
+ }
525
+
526
+ footer section {
527
+ border: 4px solid #333;
528
+ }
529
+
530
+ section h1 {
531
+ margin: 0px;
532
+ font-size: 150%;
533
+ }
534
+
535
+ section h2 {
536
+ margin: 0px;
537
+ padding: 16px 0px;
538
+ font-size: 125%;
539
+ }
540
+
541
+ section h4 {
542
+ margin: 0px;
543
+ }
544
+
545
+ section > time {
546
+ position: absolute;
547
+ border-width: 4px;
548
+ border-style: solid;
549
+ border-top: none;
550
+ border-color: #333;
551
+ color: #FFF;
552
+ background: #000;
553
+ right: -4px;
554
+ box-sizing: border-box;
555
+ bottom: -28px;
556
+ font-size: 80%;
557
+ line-height: 22px;
558
+ height: 28px;
559
+ padding: 0px 8px;
560
+ display: none;
561
+ }
562
+
563
+ section.with-time {
564
+ margin-bottom: 32px;
565
+ }
566
+
567
+ section.with-time time {
568
+ display: block;
569
+ }
570
+
571
+ .focus-cursor {
572
+ display: none;
573
+ position: absolute;
574
+ right: 100%;
575
+ top: 0;
576
+ bottom: 0;
577
+ align-items: center;
578
+ justify-content: center;
579
+ z-index: 1;
580
+ font-size: 200%;
581
+ padding: 0px 16px;
582
+ }
583
+
584
+ .block.selected > .focus-cursor {
585
+ display: flex;
586
+ }
587
+
588
+ .block.editing > .focus-cursor {
589
+ padding-right: 64px;
590
+ }
591
+
592
+ .block.folder {
593
+ padding: 0;
594
+ border-width: 0;
595
+ }
596
+
597
+ .block.folder.selected {
598
+ }
599
+
600
+ .block.background {
601
+ display: none;
602
+ }
603
+
604
+ .block.whitespace {
605
+ opacity: 0;
606
+ }
607
+
608
+ .focus-reticule {
609
+ display: none;
610
+ position: absolute;
611
+ border: 4px solid #FFF;
612
+ background: rgba(255, 255, 255, 0.5);
613
+ left: 0px;
614
+ right: 0px;
615
+ top: 0px;
616
+ bottom: 0px;
617
+ transform-origin: center;
618
+ z-index: 1;
619
+ pointer-events: none;
620
+ }
621
+
622
+ .block.selected > .focus-reticule {
623
+ display: block;
624
+ }
625
+
626
+ .focus-reticule.scaling {
627
+ animation: scaling-reticule 1s ease-out forwards;
628
+ }
629
+
630
+ .focus-reticule.flashing {
631
+ animation: flashing-reticule 1s ease-out forwards;
632
+ }
633
+
634
+ .focus-reticule-container {
635
+ position: relative;
636
+ }
637
+
638
+ @keyframes scaling-reticule {
639
+ 0% {
640
+ border-width: 1px;
641
+ transform: scale(7);
642
+ opacity: 1;
643
+ }
644
+
645
+ 75% {
646
+ opacity: 1;
647
+ }
648
+
649
+ 100% {
650
+ border-width: 4px;
651
+ transform: scale(1);
652
+ opacity: 0;
653
+ }
654
+ }
655
+
656
+ @keyframes flashing-reticule {
657
+ 0% {
658
+ opacity: 1;
659
+ }
660
+
661
+ 100% {
662
+ opacity: 0;
663
+ }
664
+ }
665
+
666
+ img {
667
+ display: block;
668
+ width: 100%;
669
+ max-width: 100%;
670
+ image-rendering: pixelated;
671
+ }
672
+
673
+ .multi-column img {
674
+ aspect-ratio: 1 / 1;
675
+ object-fit: cover;
676
+ object-position: center;
677
+ }
678
+
679
+ input, label {
680
+ display: block;
681
+ width: 100%;
682
+ box-sizing: border-box;
683
+ margin-bottom: 12px;
684
+ font-size: 100%;
685
+ }
686
+
687
+ input {
688
+ padding: 8px;
689
+ border: 4px solid rgba(255, 255, 255, 0.5);
690
+ background: #FFF;
691
+ }
692
+
693
+ input:focused {
694
+ border: 4px solid #09F;
695
+ background: #FFF;
696
+ }
697
+
698
+ .color-option {
699
+ opacity: 0;
700
+ position: absolute;
701
+ }
702
+
703
+ .color-option + label {
704
+ float: left;
705
+ width: 32px;
706
+ height: 32px;
707
+ font-size: 80%;
708
+ text-indent: -1000px;
709
+ border: 1px solid #000;
710
+ overflow: hidden;
711
+ box-sizing: border-box;
712
+ cursor: pointer;
713
+ opacity: 0.5;
714
+ }
715
+
716
+ .color-option:checked + label {
717
+ border-color: #FFF;
718
+ border-width: 4px;
719
+ opacity: 1;
720
+ }
721
+
722
+ input[type="radio"] {
723
+ display: none;
724
+ }
725
+
726
+ input[type="radio"]:checked + label {
727
+ background: #FC3;
728
+ color: #000;
729
+ }
730
+
731
+ input[type="range"] {
732
+ width: 100%;
733
+ margin: 0;
734
+ }
735
+
736
+ input[type="checkbox"] {
737
+ display: inline-block;
738
+ width: 24px;
739
+ height: 24px;
740
+ }
741
+
742
+ input[type="checkbox"] + label {
743
+ display: inline;
744
+ font-size: 80%;
745
+ color: #CCC;
746
+ font-style: italic;
747
+ line-height: 24px;
748
+ vertical-align: text-top;
749
+ }
750
+
751
+ fieldset {
752
+ margin-bottom: 16px;
753
+ }
754
+
755
+ legend {
756
+ padding: 0px 8px;
757
+ }
758
+
759
+ label {
760
+ display: block;
761
+ }
762
+
763
+ .file-wrapper {
764
+ position: relative;
765
+ }
766
+
767
+ input[type="file"] {
768
+ opacity: 0;
769
+ z-index: 1;
770
+ position: absolute;
771
+ left: 0;
772
+ right: 0;
773
+ top: 0;
774
+ bottom: 0;
775
+ margin-bottom: 0px;
776
+ cursor: pointer;
777
+ }
778
+
779
+ summary {
780
+ cursor: pointer;
781
+ }
782
+
783
+ details:open summary {
784
+ margin-bottom: 16px;
785
+ }
786
+
787
+ .summary-label {
788
+ float: right;
789
+ font-size: 80%;
790
+ color: #AAA;
791
+ }
792
+
793
+ .summary-label .icon {
794
+ display: inline-block;
795
+ height: 18px;
796
+ width: 18px;
797
+ margin-right: 8px;
798
+ }
799
+
800
+ select {
801
+ display: block;
802
+ margin-bottom: 16px;
803
+ font-size: 28px;
804
+ width: 100%;
805
+ }
806
+
807
+ textarea {
808
+ display: block;
809
+ width: 100%;
810
+ resize: vertical;
811
+ margin-bottom: 16px;
812
+ font-size: 24px;
813
+ padding: 16px;
814
+ box-sizing: border-box;
815
+ min-height: 240px;
816
+ background: #CCC;
817
+ }
818
+
819
+ table {
820
+ width: 100%;
821
+ border-collapse: collapse;
822
+ }
823
+
824
+ table.fixed {
825
+ table-layout: fixed;
826
+ }
827
+
828
+ table.compact th {
829
+ text-align: left;
830
+ }
831
+
832
+ table.compact td {
833
+ font-size: 16px;
834
+ font-family: monospace;
835
+ color: #AAA;
836
+ text-align: right;
837
+ }
838
+
839
+ table.button-row td {
840
+ margin: 8px 0px;
841
+ }
842
+
843
+ table.button-row td:first-child {
844
+ margin-left: 0px;
845
+ }
846
+
847
+ table.button-row td:last-child {
848
+ margin-right: 0px;
849
+ }
850
+
851
+ .biglink:hover table.compact td {
852
+ color: #FFF;
853
+ }
854
+
855
+ td {
856
+ text-align: center;
857
+ }
858
+
859
+ audio {
860
+ width: 100%;
861
+ }
862
+
863
+ .markdown-wrapper h1:first-child,
864
+ .markdown-wrapper h2:first-child,
865
+ .markdown-wrapper h3:first-child {
866
+ margin-top: 0;
867
+ }
868
+
869
+ .markdown-wrapper th,
870
+ .markdown-wrapper td {
871
+ text-align: left;
872
+ padding: 4px 16px;
873
+ }
874
+
875
+ .markdown-wrapper td {
876
+ text-align: left;
877
+ }
878
+
879
+ .biglink-container {
880
+ position: relative;
881
+ overflow: hidden;
882
+ border: 4px solid rgba(255, 255, 255, 0.5);
883
+ }
884
+
885
+ .biglink-container:hover {
886
+ border: 4px solid #FFF;
887
+ z-index: 1000;
888
+ }
889
+
890
+ .biglink {
891
+ display: block;
892
+ width: 100%;
893
+ background: none;
894
+ font-size: 100%;
895
+ position: relative;
896
+ border: none;
897
+ color: #09F;
898
+ box-sizing: border-box;
899
+ line-height: 100%;
900
+ white-space: nowrap;
901
+ text-align: center;
902
+ text-decoration: none;
903
+ cursor: pointer;
904
+ padding-top: 8px;
905
+ padding-bottom: 8px;
906
+ border: 4px solid rgba(255, 255, 255, 0.5);
907
+ }
908
+
909
+ .biglink.align-left {
910
+ padding-left: 8px;
911
+ }
912
+
913
+ .biglink:hover {
914
+ background-image: repeating-linear-gradient(
915
+ -45deg,
916
+ #222,
917
+ #222 10px,
918
+ #111 10px,
919
+ #111 20px
920
+ );
921
+ animation: stripes 4s linear infinite;
922
+ background-size: 200% 200%;
923
+ }
924
+
925
+ ${biglink_color_classes.join('\n')}
926
+
927
+ input[type="radio"]::checked + label {
928
+ cursor: default;
929
+ }
930
+
931
+ .stripes {
932
+ background-image: repeating-linear-gradient(
933
+ -45deg,
934
+ #222,
935
+ #222 10px,
936
+ #111 10px,
937
+ #111 20px
938
+ );
939
+ animation: stripes 4s linear infinite;
940
+ background-size: 200% 200%;
941
+ }
942
+
943
+ @keyframes stripes {
944
+ 100% {
945
+ background-position: -28px -28px;
946
+ }
947
+ }
948
+
949
+ .biglink.stretch {
950
+ margin: -100em;
951
+ padding: 100em;
952
+ border-color: transparent;
953
+ }
954
+
955
+ .biglink a {
956
+ text-decoration: none;
957
+ }
958
+
959
+ .biglink:hover, .block.selected > .biglink {
960
+ border-color: #FFF;
961
+ color: #FFF;
962
+ }
963
+
964
+ .biglink:hover a, .block.selected > .biglink a {
965
+ color: #FFF;
966
+ text-decoration: none;
967
+ }
968
+
969
+ th {
970
+ }
971
+
972
+ th.padded {
973
+ padding: 8px;
974
+ }
975
+
976
+ th.navigation {
977
+ font-size: 18px;
978
+ background: none;
979
+ border: 1px solid #F36;
980
+ }
981
+
982
+ th.navigation a {
983
+ display: block;
984
+ padding: 16px;
985
+ }
986
+
987
+ th.navigation a:hover {
988
+ background: #FFF;
989
+ color: #F00;
990
+ }
991
+
992
+ .month {
993
+ vertical-align: top;
994
+ }
995
+
996
+ .month tr {
997
+ }
998
+
999
+ .weekday {
1000
+ vertical-align: top;
1001
+ padding: 0px;
1002
+ }
1003
+
1004
+ .weekday-name {
1005
+ display: block;
1006
+ color: #666;
1007
+ }
1008
+
1009
+ .weekday-date {
1010
+ display: block;
1011
+ }
1012
+
1013
+ .weekday-posts {
1014
+ display: block;
1015
+ word-wrap: anywhere;
1016
+ text-align: left;
1017
+ font-size: 80%;
1018
+ margin-top: 8px;
1019
+ padding: 0px;
1020
+ }
1021
+
1022
+ .weekday-posts::after {
1023
+ content: "";
1024
+ display: table;
1025
+ clear: both;
1026
+ }
1027
+
1028
+ .weekday-post {
1029
+ display: block;
1030
+ float: left;
1031
+ width: 25%;
1032
+ text-align: center;
1033
+ font-weight: normal;
1034
+ color: transparent;
1035
+ font-family: monospace;
1036
+ aspect-ratio: 1 / 1;
1037
+ overflow: hidden;
1038
+ }
1039
+
1040
+ .weekday:hover .weekday-post {
1041
+ text-indent: 0px;
1042
+ background-color: transparent;
1043
+ }
1044
+
1045
+ .weekday-post.image {
1046
+ background: #FC3;
1047
+ }
1048
+
1049
+ .weekday-post.video {
1050
+ background: #F36;
1051
+ }
1052
+
1053
+ .weekday-post.audio {
1054
+ background: #09F;
1055
+ }
1056
+
1057
+ .weekday-post.text {
1058
+ background: #AAA;
1059
+ }
1060
+
1061
+ a.day {
1062
+ margin: 0 auto;
1063
+ display: block;
1064
+ padding: 8px;
1065
+ color: #FFF;
1066
+ text-decoration: none;
1067
+ width: 32px;
1068
+ height: 32px;
1069
+ line-height: 32px;
1070
+ border-radius: 32px;
1071
+ }
1072
+
1073
+ a.day:hover {
1074
+ background: #FFF;
1075
+ }
1076
+
1077
+ a.day.active {
1078
+ background: #FC3;
1079
+ color: #000;
1080
+ }
1081
+
1082
+ hr {
1083
+ border: none;
1084
+ border-top: 1px dashed #F00;
1085
+ background: none;
1086
+ margin: 32px 0px;
1087
+ }
1088
+
1089
+ .squarelink {
1090
+ height: 92px;
1091
+ width: 92px;
1092
+ font-size: 200%;
1093
+ aspect-ratio: 1 / 1;
1094
+ display: flex;
1095
+ align-items: center;
1096
+ justify-content: center;
1097
+ text-decoration: none;
1098
+ background: rgba(255, 255, 255, 0.25);
1099
+ color: #000;
1100
+ }
1101
+
1102
+ .squarelink:hover {
1103
+ background: #FFF;
1104
+ }
1105
+
1106
+ .squarelink.disabled {
1107
+ opacity: 0.5;
1108
+ cursor: not-allowed;
1109
+ }
1110
+
1111
+ .squarelink.disabled:hover {
1112
+ background: rgba(255, 255, 255, 0.25);
1113
+ }
1114
+
1115
+ .toast {
1116
+ pointer-events: none;
1117
+ animation: fadeout 4s;
1118
+ animation-fill-mode: forwards;
1119
+ position: fixed;
1120
+ top: 0;
1121
+ bottom: 0;
1122
+ left: 0;
1123
+ right: 0;
1124
+ z-index: 1;
1125
+ background: rgba(0, 0, 0, 0.75);
1126
+ }
1127
+
1128
+ @keyframes fadeout {
1129
+ 0% {
1130
+ opacity: 1;
1131
+ }
1132
+
1133
+ 50% {
1134
+ opacity: 1;
1135
+ }
1136
+
1137
+ 100% {
1138
+ opacity: 0;
1139
+ }
1140
+ }
1141
+
1142
+ @keyframes block {
1143
+ 0% {
1144
+ }
1145
+
1146
+ 100% {
1147
+ display: none;
1148
+ pointer-events: none;
1149
+ }
1150
+ }
1151
+
1152
+ input[type="checkbox"].toast-toggle {
1153
+ position: fixed;
1154
+ width: 100%;
1155
+ height: 100%;
1156
+ z-index: 2;
1157
+ display: block;
1158
+ opacity: 0;
1159
+ animation: block 4s;
1160
+ animation-fill-mode: forwards;
1161
+ }
1162
+
1163
+ .toast-toggle:checked {
1164
+ display: none;
1165
+ pointer-events: none;
1166
+ }
1167
+
1168
+ .toast-toggle:checked + .toast {
1169
+ display: none;
1170
+ }
1171
+
1172
+ .toast-wrapper {
1173
+ position: relative;
1174
+ top: 25%;
1175
+ left: 0px;
1176
+ right: 0px;
1177
+ box-sizing: border-box;
1178
+ color: #FFF;
1179
+ background: #000;
1180
+ }
1181
+
1182
+ .toast-message {
1183
+ position: relative;
1184
+ z-index: 1;
1185
+ max-width: 720px;
1186
+ margin: 0 auto;
1187
+ padding: 32px;
1188
+ text-align: center;
1189
+ font-size: 150%;
1190
+ }
1191
+
1192
+ .toast-background {
1193
+ position: absolute;
1194
+ inset: 8px 0px;
1195
+ background: rgba(0, 0, 0, 0.5);
1196
+ z-index: 0;
1197
+ }
1198
+
1199
+ aside {
1200
+ font-size: 80%;
1201
+ font-style: italic;
1202
+ color: #BBB;
1203
+ padding: 16px;
1204
+ }
1205
+
1206
+
1207
+
1208
+ .ephemeral {
1209
+ color: #777;
1210
+ font-size: 85%;
1211
+ font-style: italic;
1212
+ }
1213
+
1214
+ datalist {
1215
+ display: flex;
1216
+ flex-direction: column;
1217
+ justify-content: space-between;
1218
+ width: 100%;
1219
+ writing-mode: vertical-lr;
1220
+ }
1221
+
1222
+ datalist option {
1223
+ padding: 0;
1224
+ transform: rotate(-90deg);
1225
+ }
1226
+
1227
+ .resource-list {
1228
+ border-collapse: collapse;
1229
+ white-space: nowrap;
1230
+ }
1231
+
1232
+ .resource-list td {
1233
+ padding: 8px;
1234
+ }
1235
+
1236
+ .resource-list td, .resource-list th {
1237
+ border-right: 1px solid #FFF;
1238
+ border-bottom: 1px solid #FFF;
1239
+ }
1240
+
1241
+ .resource-list th {
1242
+ border-top: 1px solid #FFF;
1243
+ }
1244
+
1245
+ .resource-list td:first-child, .resource-list th:first-child {
1246
+ border-left: 1px solid #FFF;
1247
+ }
1248
+ </style>
1249
+
1250
+ ${utility_css}
1251
+ `;
1252
+ }
1253
+
1254
+ protected getPath(): string {
1255
+ return this.path;
1256
+ }
1257
+
1258
+ protected getReferrerUrl(): string {
1259
+ return this.referrer_url;
1260
+ }
1261
+
1262
+ protected abstract serializeSections(): string;
1263
+ protected abstract getTitle(): string;
1264
+ protected abstract getPageType(): PageType;
1265
+ }
1266
+
1267
+ export default BaseResultSerializer;