@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,360 @@
1
+ import Logger from 'lib/logger';
2
+ import {Socket, ConnectionStatus} from 'lib/network';
3
+ import EventEmitter from 'lib/event-emitter';
4
+ import KeyGenerator from 'lib/key-generator';
5
+ import {GenericError, ConflictError} from 'lib/errors';
6
+ import {StringEncoding} from 'lib/string';
7
+ import {TimeInterval} from 'lib/time';
8
+
9
+ import Channel from 'lib/tcp/channel';
10
+ import Message from 'lib/tcp/type/message';
11
+ import MessageType from 'lib/tcp/enum/message-type';
12
+ import ConnectionEvent from 'lib/tcp/enum/connection-event';
13
+ import ChannelOpenMessage from 'lib/tcp/type/message/channel-open';
14
+ import ChannelCloseMessage from 'lib/tcp/type/message/channel-close';
15
+
16
+ const HEARTBEAT_CHARACTER = '♥';
17
+ const HEARTBEAT_REGEX = new RegExp(HEARTBEAT_CHARACTER, 'g');
18
+
19
+ class Connection extends EventEmitter {
20
+ private id: string;
21
+ private connection_status: ConnectionStatus;
22
+ private remainder: string;
23
+ private channels: Channel[];
24
+ private socket: Socket;
25
+ private logger: Logger | undefined;
26
+ private parsing_enabled: boolean;
27
+
28
+ public constructor(socket: Socket) {
29
+ super();
30
+
31
+ this.id = KeyGenerator.generateToken();
32
+
33
+ if (socket.connecting) {
34
+ this.connection_status = ConnectionStatus.CONNECTING;
35
+ } else if (socket.pending === false && socket.readyState === 'open') {
36
+ this.connection_status = ConnectionStatus.CONNECTED;
37
+ } else {
38
+ this.connection_status = ConnectionStatus.DISCONNECTED;
39
+ }
40
+
41
+ this.remainder = '';
42
+ this.channels = [];
43
+ this.parsing_enabled = true;
44
+
45
+ this.bindHandlers();
46
+
47
+ this.socket = socket;
48
+ this.coupleToSocket(socket);
49
+ }
50
+
51
+ public sendMessage(message: Message): void {
52
+ const serialized_message = this.serializeMessage(message);
53
+
54
+ return this.sendRawMessage(serialized_message);
55
+ }
56
+
57
+ public sendRawMessage(raw_message: string): void {
58
+ this.validateCanSend();
59
+
60
+ const socket = this.getSocket();
61
+
62
+ socket.write(raw_message);
63
+ }
64
+
65
+ public end(): void {
66
+ const socket = this.getSocket();
67
+
68
+ socket.end();
69
+ }
70
+
71
+ public getId(): string {
72
+ return this.id;
73
+ }
74
+
75
+ public disableParsing(): void {
76
+ this.parsing_enabled = false;
77
+ }
78
+
79
+ public isConnected(): boolean {
80
+ const connection_status = this.getConnectionStatus();
81
+
82
+ return connection_status === ConnectionStatus.CONNECTED;
83
+ }
84
+
85
+ public getChannelById(channel_id: string): Channel {
86
+ const channels = this.getChannels();
87
+
88
+ const channel = channels.find((channel) => {
89
+ return channel.getId() === channel_id;
90
+ });
91
+
92
+ if (channel === undefined) {
93
+ throw new Error(`Unable to find channel ${channel_id}`);
94
+ }
95
+
96
+ return channel;
97
+ }
98
+
99
+ public openChannel(channel_id: string): Channel {
100
+ this.validateChannelId(channel_id);
101
+
102
+ const channel = new Channel(channel_id);
103
+
104
+ const message = {
105
+ id: KeyGenerator.generateToken(),
106
+ message_type: MessageType.CHANNEL_OPEN,
107
+ channel_id
108
+ };
109
+
110
+ this.sendMessage(message);
111
+ this.addChannel(channel);
112
+
113
+ return channel;
114
+ }
115
+
116
+ public closeChannel(channel_id: string): void {
117
+ const channel = this.getChannelById(channel_id);
118
+
119
+ const message = {
120
+ id: KeyGenerator.generateToken(),
121
+ message_type: MessageType.CHANNEL_CLOSE,
122
+ channel_id
123
+ };
124
+
125
+ this.sendMessage(message);
126
+ this.removeChannel(channel);
127
+ }
128
+
129
+ public getConnectionStatus(): ConnectionStatus {
130
+ return this.connection_status;
131
+ }
132
+
133
+ protected setConnectionStatus(connection_status: ConnectionStatus): void {
134
+ this.connection_status = connection_status;
135
+ this.emit(ConnectionEvent.STATUS_CHANGE, connection_status);
136
+ }
137
+
138
+ protected getSocket(): Socket {
139
+ return this.socket;
140
+ }
141
+
142
+ protected coupleToSocket(socket: Socket): void {
143
+ socket.on('data', this.handleSocketData);
144
+ socket.on('end', this.handleSocketEnd);
145
+ socket.on('error', this.handleSocketError);
146
+ }
147
+
148
+ protected bindHandlers(): void {
149
+ this.handleSocketData = this.handleSocketData.bind(this);
150
+ this.handleSocketError = this.handleSocketError.bind(this);
151
+ this.handleSocketEnd = this.handleSocketEnd.bind(this);
152
+ this.sendHeartbeat = this.sendHeartbeat.bind(this);
153
+ }
154
+
155
+ protected handleSocketError(error: Error): void {
156
+ this.emit(ConnectionEvent.ERROR, error);
157
+ }
158
+
159
+ protected handleSocketEnd(): void {
160
+ this.closeChannels();
161
+
162
+ this.setConnectionStatus(ConnectionStatus.DISCONNECTED);
163
+ this.emit(ConnectionEvent.END);
164
+ }
165
+
166
+ protected handleSocketData(data: Buffer): void {
167
+ const data_string = data
168
+ .toString(StringEncoding.UTF8)
169
+ .replace(HEARTBEAT_REGEX, '');
170
+
171
+ if (!this.parsingEnabled()) {
172
+ if (data_string.length > 0) {
173
+ this.emit(ConnectionEvent.RAW_MESSAGE, data_string);
174
+ }
175
+
176
+ return;
177
+ }
178
+
179
+ const old_remainder = this.getRemainder();
180
+ const delimiter = this.getMessageDelimiter();
181
+
182
+ let combined_string = `${old_remainder}${data_string}`;
183
+
184
+ while (combined_string.includes(delimiter)) {
185
+ const index = combined_string.indexOf(delimiter);
186
+ const current_segment = combined_string.slice(0, index);
187
+
188
+ combined_string = combined_string.slice(index + 1);
189
+
190
+ this.parseMessage(current_segment);
191
+ }
192
+
193
+ this.setRemainder(combined_string);
194
+ }
195
+
196
+ protected getLogger(): Logger {
197
+ if (this.logger === undefined) {
198
+ this.logger = new Logger();
199
+ }
200
+
201
+ return this.logger;
202
+ }
203
+
204
+ protected sendHeartbeat(): void {
205
+ if (!this.isConnected()) {
206
+ return;
207
+ }
208
+
209
+ this.sendRawMessage(HEARTBEAT_CHARACTER);
210
+
211
+ const delay = TimeInterval.ONE_SECOND * 5;
212
+
213
+ setTimeout(this.sendHeartbeat, delay);
214
+ }
215
+
216
+ private validateCanSend(): void {
217
+ if (this.isConnected()) {
218
+ return;
219
+ }
220
+
221
+ const connection_status = this.getConnectionStatus();
222
+ const id = this.getId();
223
+
224
+ const error = new GenericError(`
225
+ Cannot send message when connection status is ${connection_status}
226
+ (id: ${id})
227
+ `);
228
+
229
+ throw error;
230
+ }
231
+
232
+ private serializeMessage(message: Message): string {
233
+ const serialized_message = JSON.stringify(message);
234
+ const delimiter = this.getMessageDelimiter();
235
+
236
+ return `${serialized_message}${delimiter}`;
237
+ }
238
+
239
+ private getMessageDelimiter(): string {
240
+ return '\n';
241
+ }
242
+
243
+ private parseMessage(raw_message: string): void {
244
+ if (raw_message.length === 0) {
245
+ return;
246
+ }
247
+
248
+ let message: Message;
249
+
250
+ try {
251
+ message = JSON.parse(raw_message);
252
+ } catch (error) {
253
+ const logger = this.getLogger();
254
+
255
+ logger.warn(`Unable to parse socket message: ${raw_message}`);
256
+
257
+ this.destroy();
258
+
259
+ return;
260
+ }
261
+
262
+ this.emit(ConnectionEvent.MESSAGE, message);
263
+
264
+ switch (message.message_type) {
265
+ case MessageType.CHANNEL_OPEN:
266
+ return this.handleChannelOpenMessage(message as ChannelOpenMessage);
267
+ case MessageType.CHANNEL_CLOSE:
268
+ return this.handleChannelCloseMessage(message as ChannelCloseMessage);
269
+ }
270
+ }
271
+
272
+ private handleChannelOpenMessage(message: ChannelOpenMessage): void {
273
+ this.validateChannelId(message.channel_id);
274
+
275
+ const channel = new Channel(message.channel_id);
276
+
277
+ this.addChannel(channel);
278
+
279
+ this.emit(ConnectionEvent.CHANNEL_OPENED, channel);
280
+ }
281
+
282
+ private handleChannelCloseMessage(message: ChannelCloseMessage): void {
283
+ const channel = this.getChannelById(message.channel_id);
284
+
285
+ this.removeChannel(channel);
286
+
287
+ this.emit(ConnectionEvent.CHANNEL_CLOSED, channel);
288
+ }
289
+
290
+ private closeChannels(): void {
291
+ const channels = this.getChannels();
292
+
293
+ channels.forEach((channel) => {
294
+ this.emit(ConnectionEvent.CHANNEL_CLOSED, channel);
295
+ this.removeChannel(channel);
296
+ });
297
+ }
298
+
299
+ private addChannel(channel: Channel): void {
300
+ const channels = this.getChannels();
301
+
302
+ channels.push(channel);
303
+ }
304
+
305
+ private removeChannel(channel: Channel): void {
306
+ const channels = this.getChannels();
307
+ const index = channels.indexOf(channel);
308
+
309
+ if (index === -1) {
310
+ const channel_id = channel.getId();
311
+
312
+ throw new Error(`
313
+ Tried to remove channel ${channel_id} from channel list,
314
+ but it was not found
315
+ `);
316
+ }
317
+
318
+ channels.splice(index, 1);
319
+ }
320
+
321
+ private validateChannelId(channel_id: string): void {
322
+ if (this.hasChannelId(channel_id)) {
323
+ throw new ConflictError(`Channel ${channel_id} was already open`);
324
+ }
325
+ }
326
+
327
+ private hasChannelId(channel_id: string): boolean {
328
+ const channels = this.getChannels();
329
+
330
+ return channels.some((channel) => {
331
+ return channel.getId() === channel_id;
332
+ });
333
+ }
334
+
335
+ private getChannels(): Channel[] {
336
+ return this.channels;
337
+ }
338
+
339
+ private getRemainder(): string {
340
+ return this.remainder;
341
+ }
342
+
343
+ private setRemainder(remainder: string): void {
344
+ this.remainder = remainder;
345
+ }
346
+
347
+ private parsingEnabled(): boolean {
348
+ return this.parsing_enabled;
349
+ }
350
+
351
+ private destroy(): void {
352
+ if (this.socket === undefined) {
353
+ return;
354
+ }
355
+
356
+ this.socket.destroy();
357
+ }
358
+ }
359
+
360
+ export default Connection;
@@ -0,0 +1,12 @@
1
+ enum ConnectionEvent {
2
+ CHANNEL_CLOSED = 'channel_closed',
3
+ CHANNEL_OPENED = 'channel_opened',
4
+ CONNECT = 'connect',
5
+ END = 'end',
6
+ ERROR = 'error',
7
+ RAW_MESSAGE = 'raw_message',
8
+ MESSAGE = 'message',
9
+ STATUS_CHANGE = 'status_change'
10
+ }
11
+
12
+ export default ConnectionEvent;
@@ -0,0 +1,9 @@
1
+ enum MessageType {
2
+ CHANNEL_OPEN = 'channel_open',
3
+ CHANNEL_CLOSE = 'channel_close',
4
+ COMMAND = 'command',
5
+ EVENT = 'event',
6
+ REQUEST = 'request'
7
+ }
8
+
9
+ export default MessageType;
@@ -0,0 +1 @@
1
+ export {default as IncomingConnection} from 'lib/tcp/connection/incoming';
@@ -0,0 +1,6 @@
1
+ interface ConnectionParameters {
2
+ readonly port: number;
3
+ readonly hostname: string;
4
+ }
5
+
6
+ export default ConnectionParameters;
@@ -0,0 +1,9 @@
1
+ import Message from 'lib/tcp/type/message';
2
+ import MessageType from 'lib/tcp/enum/message-type';
3
+
4
+ interface ChannelCloseMessage extends Message {
5
+ readonly message_type: MessageType.CHANNEL_CLOSE;
6
+ readonly channel_id: string;
7
+ }
8
+
9
+ export default ChannelCloseMessage;
@@ -0,0 +1,9 @@
1
+ import Message from 'lib/tcp/type/message';
2
+ import MessageType from 'lib/tcp/enum/message-type';
3
+
4
+ interface ChannelOpenMessage extends Message {
5
+ readonly message_type: MessageType.CHANNEL_OPEN;
6
+ readonly channel_id: string;
7
+ }
8
+
9
+ export default ChannelOpenMessage;
@@ -0,0 +1,10 @@
1
+ import MessageType from 'lib/tcp/enum/message-type';
2
+
3
+ interface Message {
4
+ readonly message_type: MessageType;
5
+ readonly id: string;
6
+ readonly connection_id?: string;
7
+ readonly channel_id?: string;
8
+ }
9
+
10
+ export default Message;
@@ -0,0 +1,2 @@
1
+ export {default as buildExecutionContext} from 'lib/test/utility/build-execution-context';
2
+ export {default as buildConfig} from 'lib/test/utility/build-config';
@@ -0,0 +1,17 @@
1
+ import MemoryRepository from 'server/repository/memory';
2
+ import RuntimeConfig from 'type/runtime-config';
3
+
4
+ function buildConfig(): RuntimeConfig {
5
+ const public_directory = '/tmp/public';
6
+ const repository = new MemoryRepository();
7
+
8
+ return {
9
+ public_directory,
10
+ repository,
11
+ roles: [],
12
+ providers: [],
13
+ hydrate: undefined
14
+ };
15
+ }
16
+
17
+ export default buildConfig;
@@ -0,0 +1,11 @@
1
+ import ExecutionContext from 'lib/execution-context';
2
+
3
+ import buildConfig from 'lib/test/utility/build-config';
4
+
5
+ function buildExecutionContext(): ExecutionContext {
6
+ const config = buildConfig();
7
+
8
+ return new ExecutionContext(config);
9
+ }
10
+
11
+ export default buildExecutionContext;
@@ -0,0 +1 @@
1
+ throw new Error('Not implemented');
@@ -0,0 +1,12 @@
1
+ enum TimeInterval {
2
+ ONE_FRAME = 16,
3
+ ONE_SECOND = 1000,
4
+ ONE_MINUTE = 1000 * 60,
5
+ ONE_HOUR = 1000 * 60 * 60,
6
+ ONE_DAY = 1000 * 60 * 60 * 24,
7
+ ONE_WEEK = 1000 * 60 * 60 * 24 * 7,
8
+ ONE_MONTH = 1000 * 60 * 60 * 24 * 30,
9
+ ONE_YEAR = 1000 * 60 * 60 * 24 * 365
10
+ }
11
+
12
+ export default TimeInterval;
@@ -0,0 +1,4 @@
1
+ export {default as TimeInterval} from 'lib/time/enum/time-interval';
2
+ export {default as sleep} from 'lib/time/utility/sleep';
3
+ export {default as formatRelativeDuration} from 'lib/time/utility/format-relative-duration';
4
+ export {default as formatDuration} from 'lib/time/utility/format-duration';
@@ -0,0 +1,139 @@
1
+ import {NounInflector} from 'lib/grammar';
2
+
3
+ import TimeInterval from 'lib/time/enum/time-interval';
4
+
5
+ function formatMilliseconds(ms: number, shorthand = false): string {
6
+ if (shorthand) {
7
+ return `${ms}ms`;
8
+ }
9
+
10
+ const inflector = new NounInflector();
11
+
12
+ return inflector.singularizeOrPluralize(ms, 'millisecond');
13
+ }
14
+
15
+ function formatSeconds(ms: number, shorthand = false): string {
16
+ const seconds = Math.floor(ms / TimeInterval.ONE_SECOND);
17
+
18
+ if (shorthand) {
19
+ return `${seconds}s`;
20
+ }
21
+
22
+ const inflector = new NounInflector();
23
+
24
+ return inflector.singularizeOrPluralize(seconds, 'second');
25
+ }
26
+
27
+ function formatMinutes(ms: number, shorthand = false): string {
28
+ const minutes = Math.floor(ms / TimeInterval.ONE_MINUTE);
29
+
30
+ if (shorthand) {
31
+ return `${minutes}m`;
32
+ }
33
+
34
+ const inflector = new NounInflector();
35
+
36
+ return inflector.singularizeOrPluralize(minutes, 'minute');
37
+ }
38
+
39
+ function formatHours(ms: number, shorthand = false): string {
40
+ const hours = Math.floor(ms / TimeInterval.ONE_HOUR);
41
+
42
+ if (shorthand) {
43
+ return `${hours}h`;
44
+ }
45
+
46
+ const inflector = new NounInflector();
47
+
48
+ return inflector.singularizeOrPluralize(hours, 'hour');
49
+ }
50
+
51
+ function formatDays(ms: number, shorthand = false): string {
52
+ const days = Math.floor(ms / TimeInterval.ONE_DAY);
53
+
54
+ if (shorthand) {
55
+ return `${days}d`;
56
+ }
57
+
58
+ const inflector = new NounInflector();
59
+
60
+ return inflector.singularizeOrPluralize(days, 'day');
61
+ }
62
+
63
+ function formatWeeks(ms: number, shorthand = false): string {
64
+ const weeks = Math.floor(ms / TimeInterval.ONE_WEEK);
65
+
66
+ if (shorthand) {
67
+ return `${weeks}w`;
68
+ }
69
+
70
+ const inflector = new NounInflector();
71
+
72
+ return inflector.singularizeOrPluralize(weeks, 'week');
73
+ }
74
+
75
+ function formatMonths(ms: number, shorthand = false): string {
76
+ const months = Math.floor(ms / TimeInterval.ONE_MONTH);
77
+
78
+ if (shorthand) {
79
+ return `${months}mo`;
80
+ }
81
+
82
+ const inflector = new NounInflector();
83
+
84
+ return inflector.singularizeOrPluralize(months, 'month');
85
+ }
86
+
87
+ function formatYears(ms: number, shorthand = false): string {
88
+ let years = ms / TimeInterval.ONE_YEAR;
89
+
90
+ const years_rounded = Math.round(years);
91
+
92
+ if (Math.abs(years - years_rounded) < 1 / 24) {
93
+ years = years_rounded;
94
+ } else {
95
+ years = parseFloat(years.toFixed(1));
96
+ }
97
+
98
+ if (shorthand) {
99
+ return `${years}y`;
100
+ }
101
+
102
+ const inflector = new NounInflector();
103
+
104
+ return inflector.singularizeOrPluralize(years, 'year');
105
+ }
106
+
107
+ function formatDuration(ms: number, shorthand = false): string {
108
+ if (ms < TimeInterval.ONE_SECOND) {
109
+ return formatMilliseconds(ms, shorthand);
110
+ }
111
+
112
+ if (ms < TimeInterval.ONE_MINUTE) {
113
+ return formatSeconds(ms, shorthand);
114
+ }
115
+
116
+ if (ms < TimeInterval.ONE_HOUR) {
117
+ return formatMinutes(ms, shorthand);
118
+ }
119
+
120
+ if (ms < TimeInterval.ONE_DAY) {
121
+ return formatHours(ms, shorthand);
122
+ }
123
+
124
+ if (ms < TimeInterval.ONE_WEEK) {
125
+ return formatDays(ms, shorthand);
126
+ }
127
+
128
+ if (ms < TimeInterval.ONE_MONTH) {
129
+ return formatWeeks(ms, shorthand);
130
+ }
131
+
132
+ if (ms < TimeInterval.ONE_YEAR) {
133
+ return formatMonths(ms, shorthand);
134
+ }
135
+
136
+ return formatYears(ms, shorthand);
137
+ }
138
+
139
+ export default formatDuration;
@@ -0,0 +1,22 @@
1
+ import formatDuration from 'lib/time/utility/format-duration';
2
+
3
+ function formatRelativeDuration(
4
+ date: number | Date | string,
5
+ shorthand = false
6
+ ): string {
7
+ let ms: number;
8
+
9
+ if (date instanceof Date) {
10
+ ms = date.getTime();
11
+ } else if (typeof date === 'string') {
12
+ ms = new Date(date).getTime();
13
+ } else {
14
+ ms = date;
15
+ }
16
+
17
+ const elapsed_time = Date.now() - ms;
18
+
19
+ return formatDuration(elapsed_time, shorthand);
20
+ }
21
+
22
+ export default formatRelativeDuration;
@@ -0,0 +1,9 @@
1
+ function sleep(duration: number): Promise<void> {
2
+ return new Promise((resolve) => {
3
+ setTimeout(() => {
4
+ resolve();
5
+ }, duration);
6
+ });
7
+ }
8
+
9
+ export default sleep;
@@ -0,0 +1,18 @@
1
+ import {AutoLoggingOperation} from 'lib/operation';
2
+ import ExecutionContext from 'lib/execution-context';
3
+
4
+ import RuntimeConfig from 'type/runtime-config';
5
+
6
+ abstract class BaseOperation<T> extends AutoLoggingOperation<T> {
7
+ public constructor(execution_context: ExecutionContext) {
8
+ super(execution_context);
9
+ }
10
+
11
+ protected getConfig(): RuntimeConfig {
12
+ const execution_context = this.getExecutionContext();
13
+
14
+ return execution_context.getConfig();
15
+ }
16
+ }
17
+
18
+ export default BaseOperation;