@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,8 @@
1
+ enum LogLevel {
2
+ ERROR = 'error',
3
+ INFO = 'info',
4
+ SUCCESS = 'success',
5
+ WARNING = 'warning'
6
+ }
7
+
8
+ export default LogLevel;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * This class is useful mostly for dev. It wraps messages in the necessary
3
+ * ANSI codes for color-coding certain messages based on log level.
4
+ */
5
+
6
+ import LogLevel from 'lib/logger/enum/log-level';
7
+ import AnsiEscapeCode from 'lib/logger/enum/ansi-escape-code';
8
+
9
+ class LogFormatter {
10
+ private message: string;
11
+ private log_level: LogLevel;
12
+
13
+ public constructor(message: string, log_level: LogLevel) {
14
+ this.message = message;
15
+ this.log_level = log_level;
16
+ }
17
+
18
+ public format(): string {
19
+ const message = this.getMessage();
20
+ const log_level = this.getLogLevel();
21
+
22
+ if (log_level === LogLevel.INFO) {
23
+ return message;
24
+ }
25
+
26
+ const escape_code = this.getAnsiEscapeCodeForLogLevel(log_level);
27
+ const reset_code = this.getAnsiResetCode();
28
+
29
+ return `${escape_code}${message}${reset_code}`;
30
+ }
31
+
32
+ private getAnsiEscapeCodeForLogLevel(log_level: LogLevel): AnsiEscapeCode {
33
+ switch (log_level) {
34
+ case LogLevel.SUCCESS:
35
+ return AnsiEscapeCode.GREEN;
36
+ case LogLevel.WARNING:
37
+ return AnsiEscapeCode.YELLOW;
38
+ case LogLevel.ERROR:
39
+ return AnsiEscapeCode.RED;
40
+ case LogLevel.INFO:
41
+ default:
42
+ return AnsiEscapeCode.WHITE;
43
+ }
44
+ }
45
+
46
+ private getAnsiResetCode(): AnsiEscapeCode {
47
+ return AnsiEscapeCode.RESET;
48
+ }
49
+
50
+ private getMessage(): string {
51
+ return this.message;
52
+ }
53
+
54
+ private getLogLevel(): LogLevel {
55
+ return this.log_level;
56
+ }
57
+ }
58
+
59
+ export default LogFormatter;
@@ -0,0 +1,7 @@
1
+ import Logger from 'lib/logger/logger';
2
+
3
+ export {default as LogLevel} from 'lib/logger/enum/log-level';
4
+ export {default as LoggableData} from 'lib/logger/type/loggable-data';
5
+ export {default as LoggerInterface} from 'lib/logger/interface/logger';
6
+
7
+ export default Logger;
@@ -0,0 +1,7 @@
1
+ import ErrorParameters from 'lib/logger/type/error-parameters';
2
+
3
+ interface ErrorReporter {
4
+ notify(message: string, parameters: ErrorParameters): void;
5
+ }
6
+
7
+ export default ErrorReporter;
@@ -0,0 +1,13 @@
1
+ import LogLevel from 'lib/logger/enum/log-level';
2
+ import LoggableData from 'lib/logger/type/loggable-data';
3
+
4
+ interface LoggerInterface {
5
+ setRemoteAddress(remote_address: string): LoggerInterface;
6
+ error(message: Error | string | LoggableData): void;
7
+ warn(message: string | LoggableData): void;
8
+ info(message: string | LoggableData): void;
9
+ success(message: string | LoggableData): void;
10
+ writeMessage(message: string, log_level: LogLevel): void;
11
+ }
12
+
13
+ export default LoggerInterface;
@@ -0,0 +1,239 @@
1
+ /**
2
+ * The Logger class is exactly what it sounds like: you can use it to log
3
+ * messages from the Node.js environment. Please use this instead of calling
4
+ * console.log() or process.stdout.write(), etc.
5
+ *
6
+ * In development, the Logger class will pretty-print output logs for you
7
+ * to view in the console. In production, the Logger will print JSON-formatted
8
+ * message objects.
9
+ */
10
+
11
+ import {EventEmitter} from 'events';
12
+
13
+ import {isProductionOrStaging} from 'lib/environment';
14
+ import Feature from 'lib/feature';
15
+
16
+ import LogLevel from 'lib/logger/enum/log-level';
17
+ import LogFormatter from 'lib/logger/formatter';
18
+ import LoggableData from 'lib/logger/type/loggable-data';
19
+ import ErrorReporter from 'lib/logger/interface/error-reporter';
20
+ import LoggerInterface from 'lib/logger/interface/logger';
21
+ import {LoggableValue} from 'lib/logger/type/loggable-value';
22
+
23
+ class Logger extends EventEmitter implements LoggerInterface {
24
+ private static error_reporter: ErrorReporter | undefined;
25
+
26
+ public static setErrorReporter(
27
+ error_reporter: ErrorReporter | undefined
28
+ ): void {
29
+ this.error_reporter = error_reporter;
30
+ }
31
+
32
+ public static getErrorReporter(): ErrorReporter {
33
+ if (this.error_reporter === undefined) {
34
+ throw new Error('Tried to read error reporter, but it was not set');
35
+ }
36
+
37
+ return this.error_reporter;
38
+ }
39
+
40
+ public static hasErrorReporter(): boolean {
41
+ return this.error_reporter !== undefined;
42
+ }
43
+
44
+ private unique_id: string | undefined;
45
+ private remote_address: string | undefined;
46
+ private origin: string | undefined;
47
+
48
+ public constructor() {
49
+ super();
50
+
51
+ this.bindHandlers();
52
+ }
53
+
54
+ public setUniqueId(unique_id: string): this {
55
+ this.unique_id = unique_id;
56
+ return this;
57
+ }
58
+
59
+ public setRemoteAddress(remote_address: string): this {
60
+ this.remote_address = remote_address;
61
+ return this;
62
+ }
63
+
64
+ public setOrigin(origin: string): this {
65
+ this.origin = origin;
66
+ return this;
67
+ }
68
+
69
+ public error(message: Error | string): void {
70
+ if (message instanceof Error) {
71
+ message = message.toString();
72
+ }
73
+
74
+ return void this.writeMessage(message, LogLevel.ERROR);
75
+ }
76
+
77
+ public warn(message: string | LoggableData): void {
78
+ return void this.writeMessage(message, LogLevel.WARNING);
79
+ }
80
+
81
+ public info(message: string | LoggableData): void {
82
+ return void this.writeMessage(message, LogLevel.INFO);
83
+ }
84
+
85
+ public success(message: string | LoggableData): void {
86
+ return void this.writeMessage(message, LogLevel.SUCCESS);
87
+ }
88
+
89
+ public writeMessage(body: string | LoggableData, log_level: LogLevel): void {
90
+ const unique_id = this.getUniqueId();
91
+ const remote_address = this.getRemoteAddress();
92
+ const origin = this.getOrigin();
93
+ const timestamp = Date.now();
94
+
95
+ const message = {
96
+ unique_id,
97
+ remote_address,
98
+ origin,
99
+ timestamp,
100
+ log_level
101
+ };
102
+
103
+ if (typeof body === 'string') {
104
+ Object.assign(message, {
105
+ body
106
+ });
107
+ } else {
108
+ Object.assign(message, body);
109
+ }
110
+
111
+ if (log_level === LogLevel.ERROR && this.shouldReportErrors()) {
112
+ this.reportError(message);
113
+ }
114
+
115
+ const serialized_message = this.serializeMessage(message);
116
+
117
+ process.stdout.write(`${serialized_message}\n`);
118
+ }
119
+
120
+ public errorAndExit(error: string | Error): void {
121
+ this.error(error);
122
+
123
+ if (error instanceof Error && error.stack !== undefined) {
124
+ this.error(error.stack);
125
+ }
126
+
127
+ process.exit(1);
128
+ }
129
+
130
+ public successAndExit(message: string): void {
131
+ this.success(message);
132
+ process.exit(0);
133
+ }
134
+
135
+ private bindHandlers(): void {
136
+ this.errorAndExit = this.errorAndExit.bind(this);
137
+ this.successAndExit = this.successAndExit.bind(this);
138
+ }
139
+
140
+ private getUniqueId(): string | undefined {
141
+ return this.unique_id;
142
+ }
143
+
144
+ private getRemoteAddress(): string | undefined {
145
+ return this.remote_address;
146
+ }
147
+
148
+ private getOrigin(): string | undefined {
149
+ return this.origin;
150
+ }
151
+
152
+ private shouldLogAsJson(): boolean {
153
+ if (!Feature.isEnabled('logger.json_logging')) {
154
+ return false;
155
+ }
156
+
157
+ return isProductionOrStaging();
158
+ }
159
+
160
+ private serializeMessage(message: LoggableData): string {
161
+ if (this.shouldLogAsJson()) {
162
+ return this.serializeMessageAsJson(message);
163
+ } else {
164
+ return this.serializeMessageAsHumanReadableText(message);
165
+ }
166
+ }
167
+
168
+ private serializeMessageAsJson(message: LoggableData): string {
169
+ const trimmed_message = this.trimExtraWhitespaceFromMessage(message);
170
+
171
+ return JSON.stringify(trimmed_message);
172
+ }
173
+
174
+ private serializeMessageAsHumanReadableText(message: LoggableData): string {
175
+ const text = this.trimExtraWhitespaceFromLoggableValue(message.body);
176
+ const id = message.unique_id || message.remote_address;
177
+
178
+ const parts = [];
179
+
180
+ parts.push(`[${message.timestamp}]`);
181
+
182
+ if (id) {
183
+ parts.push(`[${id}]`);
184
+ }
185
+
186
+ parts.push(text);
187
+
188
+ const formatted_message = parts.join(' ');
189
+
190
+ const formatter = new LogFormatter(
191
+ formatted_message,
192
+ message.log_level as LogLevel
193
+ );
194
+
195
+ return formatter.format();
196
+ }
197
+
198
+ private trimExtraWhitespaceFromMessage(
199
+ input_message: LoggableData
200
+ ): LoggableData {
201
+ const result: LoggableData = {};
202
+
203
+ for (const key in input_message) {
204
+ const value = input_message[key];
205
+
206
+ result[key] = this.trimExtraWhitespaceFromLoggableValue(value);
207
+ }
208
+
209
+ return result;
210
+ }
211
+
212
+ private trimExtraWhitespaceFromLoggableValue(
213
+ value: LoggableValue
214
+ ): LoggableValue {
215
+ if (typeof value !== 'string') {
216
+ return value;
217
+ }
218
+
219
+ return value.replace(/\s+/g, ' ').trim();
220
+ }
221
+
222
+ private shouldReportErrors(): boolean {
223
+ if (!Logger.hasErrorReporter()) {
224
+ return false;
225
+ }
226
+
227
+ return isProductionOrStaging();
228
+ }
229
+
230
+ private reportError(error: LoggableData): void {
231
+ Logger.getErrorReporter().notify(error.message as string, {
232
+ meta_data: {
233
+ unique_id: error.unique_id
234
+ }
235
+ });
236
+ }
237
+ }
238
+
239
+ export default Logger;
@@ -0,0 +1,9 @@
1
+ import {LoggableValue} from 'lib/logger/type/loggable-value';
2
+
3
+ interface ErrorParameters {
4
+ meta_data: {
5
+ [key: string]: LoggableValue;
6
+ };
7
+ }
8
+
9
+ export default ErrorParameters;
@@ -0,0 +1,5 @@
1
+ import {LoggableValue} from 'lib/logger/type/loggable-value';
2
+
3
+ export default interface LoggableData {
4
+ [key: string]: LoggableValue;
5
+ }
@@ -0,0 +1 @@
1
+ export type LoggableValue = string | number | undefined | null;
@@ -0,0 +1,264 @@
1
+ /**
2
+ * This class is a wrapper around the StatsD calls that we need to make
3
+ * from a Node.js process in order to power things like Datadog dashboards, etc.
4
+ *
5
+ * It basically exists to provide an abstract interface over the `node-statsd`
6
+ * third-party library.
7
+ */
8
+
9
+ import {StatsD as StatsdClient} from 'node-statsd';
10
+
11
+ import Logger from 'lib/logger';
12
+ import {isProduction} from 'lib/environment';
13
+ import Feature from 'lib/feature';
14
+
15
+ import TagMap from 'lib/metrics/type/tag-map';
16
+ import DispatchMode from 'lib/metrics/enum/dispatch-mode';
17
+ import SettingsHydrator from 'lib/metrics/settings-hydrator';
18
+ import DispatcherSettings from 'lib/metrics/type/dispatcher-settings';
19
+
20
+ class MetricsDispatcher {
21
+ private static instance: MetricsDispatcher;
22
+
23
+ public static getInstance(): MetricsDispatcher {
24
+ if (this.instance === undefined) {
25
+ this.instance = new MetricsDispatcher();
26
+ }
27
+
28
+ return this.instance;
29
+ }
30
+
31
+ public static setInstance(instance: MetricsDispatcher): void {
32
+ if (this.instance) {
33
+ this.instance.disconnect();
34
+ }
35
+
36
+ this.instance = instance;
37
+ }
38
+
39
+ private settings: DispatcherSettings;
40
+ private client: StatsdClient | undefined;
41
+ private logger: Logger | undefined;
42
+
43
+ public constructor(partial_settings?: Partial<DispatcherSettings>) {
44
+ if (partial_settings === undefined) {
45
+ partial_settings = {};
46
+ }
47
+
48
+ const hydrator = new SettingsHydrator(partial_settings);
49
+
50
+ this.settings = hydrator.hydrate();
51
+ }
52
+
53
+ public mute(): this {
54
+ this.setDispatchMode(DispatchMode.MUTED);
55
+
56
+ return this;
57
+ }
58
+
59
+ public unmute(): this {
60
+ this.setDispatchMode(DispatchMode.UNMUTED);
61
+
62
+ return this;
63
+ }
64
+
65
+ public gauge(metric_name: string, value: number, tags?: TagMap): this {
66
+ const prepared_tags = this.prepareTags(metric_name, tags);
67
+
68
+ this.getClient().gauge(metric_name, value, prepared_tags);
69
+
70
+ return this;
71
+ }
72
+
73
+ public increment(metric_name: string, amount?: number, tags?: TagMap): this {
74
+ if (amount === undefined) {
75
+ amount = 1;
76
+ } else if (amount < 0) {
77
+ throw new Error(
78
+ `Must specify positive amount to increment (got ${amount})`
79
+ );
80
+ }
81
+
82
+ const prepared_tags = this.prepareTags(metric_name, tags);
83
+
84
+ this.getClient().increment(metric_name, amount, prepared_tags);
85
+
86
+ return this;
87
+ }
88
+
89
+ public decrement(metric_name: string, amount?: number, tags?: TagMap): this {
90
+ if (amount === undefined) {
91
+ amount = -1;
92
+ } else if (amount > 0) {
93
+ throw new Error(
94
+ `Must specify negative value to decrement (got ${amount})`
95
+ );
96
+ }
97
+
98
+ const prepared_tags = this.prepareTags(metric_name, tags);
99
+
100
+ this.getClient().decrement(metric_name, amount * -1, prepared_tags);
101
+
102
+ return this;
103
+ }
104
+
105
+ public timing(
106
+ metric_name: string,
107
+ milliseconds: number,
108
+ tags?: TagMap
109
+ ): this {
110
+ const prepared_tags = this.prepareTags(metric_name, tags);
111
+
112
+ this.getClient().timing(metric_name, milliseconds, prepared_tags);
113
+
114
+ return this;
115
+ }
116
+
117
+ public disconnect(): void {
118
+ if (this.client) {
119
+ this.client.close();
120
+ }
121
+ }
122
+
123
+ private getClient(): StatsdClient {
124
+ if (!this.client) {
125
+ this.client = this.createClient();
126
+ }
127
+
128
+ return this.client;
129
+ }
130
+
131
+ private createClient(): StatsdClient {
132
+ const client_properties = {
133
+ host: this.getHost(),
134
+ port: this.getPort(),
135
+ // eslint-disable-next-line @typescript-eslint/naming-convention
136
+ cacheDns: this.shouldCacheDns(),
137
+ mock: this.shouldMock()
138
+ };
139
+
140
+ const client = new StatsdClient(client_properties);
141
+
142
+ // Manually unref the underlying UDP socket to allow the process to close
143
+ // even if the StatsD connection is still open.
144
+ // TODO: Should we use ShutdownManager hooks for this instead?
145
+ client.socket.unref();
146
+
147
+ return client;
148
+ }
149
+
150
+ private getHost(): string {
151
+ const settings = this.getSettings();
152
+
153
+ return settings.host;
154
+ }
155
+
156
+ private getPort(): number {
157
+ const settings = this.getSettings();
158
+
159
+ return settings.port;
160
+ }
161
+
162
+ private getDispatchMode(): DispatchMode {
163
+ const settings = this.getSettings();
164
+
165
+ return settings.dispatch_mode;
166
+ }
167
+
168
+ private setDispatchMode(dispatch_mode: DispatchMode): void {
169
+ const settings = this.getSettings();
170
+
171
+ this.settings = {
172
+ ...settings,
173
+ dispatch_mode
174
+ };
175
+ }
176
+
177
+ private getTags(): TagMap {
178
+ const settings = this.getSettings();
179
+
180
+ return settings.tags;
181
+ }
182
+
183
+ private getSettings(): DispatcherSettings {
184
+ return this.settings;
185
+ }
186
+
187
+ private prepareTags(
188
+ metric_name: string,
189
+ ephemeral_tags: TagMap | undefined
190
+ ): string[] {
191
+ if (!Feature.isEnabled('metric_tags')) {
192
+ if (ephemeral_tags === undefined) {
193
+ return [];
194
+ }
195
+
196
+ // Just because these are very noisy:
197
+ switch (metric_name) {
198
+ case 'incoming_responses':
199
+ case 'outgoing_responses':
200
+ case 'incoming_response_time':
201
+ case 'outgoing_response_time':
202
+ return [];
203
+ }
204
+
205
+ const tag_keys = Object.keys(ephemeral_tags);
206
+
207
+ if (tag_keys.length > 0) {
208
+ const logger = this.getLogger();
209
+ const serialized_tags = tag_keys.join(', ');
210
+
211
+ logger.warn(`
212
+ Metric tags are disabled!
213
+ Received the following tags for metric "${metric_name}":
214
+ ${serialized_tags}
215
+ `);
216
+ }
217
+
218
+ return [];
219
+ }
220
+
221
+ const persistent_tags = this.getTags();
222
+
223
+ if (ephemeral_tags === undefined) {
224
+ return this.concatenateTags(persistent_tags);
225
+ }
226
+
227
+ const combined_tags = this.combineTags(persistent_tags, ephemeral_tags);
228
+
229
+ return this.concatenateTags(combined_tags);
230
+ }
231
+
232
+ private combineTags(persistent_tags: TagMap, ephemeral_tags: TagMap): TagMap {
233
+ const result = {};
234
+
235
+ Object.assign(result, persistent_tags);
236
+ Object.assign(result, ephemeral_tags);
237
+
238
+ return result as TagMap;
239
+ }
240
+
241
+ private concatenateTags(tags: TagMap): string[] {
242
+ return Object.keys(tags).map((key) => {
243
+ return `${key}:${tags[key]}`;
244
+ });
245
+ }
246
+
247
+ private shouldCacheDns(): boolean {
248
+ return isProduction();
249
+ }
250
+
251
+ private shouldMock(): boolean {
252
+ return this.getDispatchMode() === DispatchMode.MUTED;
253
+ }
254
+
255
+ private getLogger(): Logger {
256
+ if (this.logger === undefined) {
257
+ this.logger = new Logger();
258
+ }
259
+
260
+ return this.logger;
261
+ }
262
+ }
263
+
264
+ export default MetricsDispatcher;
@@ -0,0 +1,6 @@
1
+ enum DispatchMode {
2
+ MUTED = 'muted',
3
+ UNMUTED = 'unmuted'
4
+ }
5
+
6
+ export default DispatchMode;
@@ -0,0 +1,2 @@
1
+ export {default as TagMap} from 'lib/metrics/type/tag-map';
2
+ export {default as Dispatcher} from 'lib/metrics/dispatcher';
@@ -0,0 +1,51 @@
1
+ import TagMap from 'lib/metrics/type/tag-map';
2
+ import DispatchMode from 'lib/metrics/enum/dispatch-mode';
3
+ import DispatcherSettings from 'lib/metrics/type/dispatcher-settings';
4
+
5
+ class SettingsHydrator {
6
+ private partial_settings: Partial<DispatcherSettings>;
7
+
8
+ public constructor(partial_settings: Partial<DispatcherSettings>) {
9
+ this.partial_settings = partial_settings;
10
+ }
11
+
12
+ public hydrate(): DispatcherSettings {
13
+ const partial_settings = this.getPartialSettings();
14
+ const host = this.getDefaultHost();
15
+ const port = this.getDefaultPort();
16
+ const tags = this.getDefaultTags();
17
+ const dispatch_mode = this.getDefaultDispatchMode();
18
+ const prefix = '';
19
+
20
+ return {
21
+ host,
22
+ port,
23
+ tags,
24
+ dispatch_mode,
25
+ prefix,
26
+ ...partial_settings
27
+ };
28
+ }
29
+
30
+ private getDefaultHost(): string {
31
+ return 'localhost';
32
+ }
33
+
34
+ private getDefaultPort(): number {
35
+ return 1234;
36
+ }
37
+
38
+ private getDefaultTags(): TagMap {
39
+ return {};
40
+ }
41
+
42
+ private getDefaultDispatchMode(): DispatchMode {
43
+ return DispatchMode.UNMUTED;
44
+ }
45
+
46
+ private getPartialSettings(): Partial<DispatcherSettings> {
47
+ return this.partial_settings;
48
+ }
49
+ }
50
+
51
+ export default SettingsHydrator;
@@ -0,0 +1,12 @@
1
+ import TagMap from 'lib/metrics/type/tag-map';
2
+ import DispatchMode from 'lib/metrics/enum/dispatch-mode';
3
+
4
+ interface DispatcherSettings {
5
+ readonly host: string;
6
+ readonly port: number;
7
+ readonly prefix: string;
8
+ readonly tags: TagMap;
9
+ readonly dispatch_mode: DispatchMode;
10
+ }
11
+
12
+ export default DispatcherSettings;
@@ -0,0 +1,5 @@
1
+ interface TagMap {
2
+ [key: string]: string | number;
3
+ }
4
+
5
+ export default TagMap;
@@ -0,0 +1 @@
1
+ throw new Error('Not implemented');