@joystick.js/node-canary 0.0.0-canary.47 → 0.0.0-canary.471

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 (439) hide show
  1. package/.build/getFilesToBuild.js +26 -0
  2. package/.build/getPlatformSafeFilePath.js +6 -0
  3. package/.build/getPlatformSafePath.js +6 -0
  4. package/.build/index.js +88 -0
  5. package/.build/isWindows.js +3 -0
  6. package/dist/action/class.js +1 -82
  7. package/dist/action/index.js +1 -8
  8. package/dist/app/accounts/default_user_output_fields.js +1 -0
  9. package/dist/app/accounts/delete_user.js +1 -0
  10. package/dist/app/accounts/generate_account_session.js +1 -0
  11. package/dist/app/accounts/generate_password_reset_token.js +1 -0
  12. package/dist/app/accounts/get_browser_safe_user.js +1 -0
  13. package/dist/app/accounts/has_login_token_expired.js +1 -0
  14. package/dist/app/accounts/index.js +1 -29
  15. package/dist/app/accounts/login.js +1 -59
  16. package/dist/app/accounts/recover_password.js +1 -0
  17. package/dist/app/accounts/reset_password.js +1 -0
  18. package/dist/app/accounts/roles/add.js +1 -7
  19. package/dist/app/accounts/roles/grant.js +1 -7
  20. package/dist/app/accounts/roles/index.js +1 -17
  21. package/dist/app/accounts/roles/list.js +1 -7
  22. package/dist/app/accounts/roles/remove.js +1 -7
  23. package/dist/app/accounts/roles/revoke.js +1 -7
  24. package/dist/app/accounts/roles/user_has_role.js +1 -0
  25. package/dist/app/accounts/send_email_verification.js +1 -0
  26. package/dist/app/accounts/set_account_cookie.js +1 -0
  27. package/dist/app/accounts/set_password.js +1 -0
  28. package/dist/app/accounts/signup.js +1 -97
  29. package/dist/app/accounts/unset_account_cookie.js +1 -0
  30. package/dist/app/accounts/verify_email.js +1 -0
  31. package/dist/app/api/accounts/authenticated.js +1 -0
  32. package/dist/app/api/accounts/login.js +1 -0
  33. package/dist/app/api/accounts/logout.js +1 -0
  34. package/dist/app/api/accounts/recover_password.js +1 -0
  35. package/dist/app/api/accounts/reset_password.js +1 -0
  36. package/dist/app/api/accounts/signup.js +1 -0
  37. package/dist/app/api/accounts/user.js +1 -0
  38. package/dist/app/api/accounts/verify_email.js +1 -0
  39. package/dist/app/api/format_api_error.js +1 -0
  40. package/dist/app/api/get.js +2 -0
  41. package/dist/app/api/get_api_context.js +1 -0
  42. package/dist/app/api/get_api_for_data_functions.js +1 -0
  43. package/dist/app/api/get_api_url_component.js +1 -0
  44. package/dist/app/api/get_output.js +1 -0
  45. package/dist/app/api/get_value_from_object.js +1 -0
  46. package/dist/app/api/handle_api_error.js +1 -0
  47. package/dist/app/api/input_validators.js +1 -0
  48. package/dist/app/api/is_array_path.js +1 -0
  49. package/dist/app/api/push/health.js +2 -0
  50. package/dist/app/api/register_getters.js +1 -0
  51. package/dist/app/api/register_setters.js +1 -0
  52. package/dist/app/api/sanitize_api_response.js +1 -0
  53. package/dist/app/api/set.js +2 -0
  54. package/dist/app/api/test/accounts/delete.js +1 -0
  55. package/dist/app/api/test/accounts/signup.js +1 -0
  56. package/dist/app/api/test/bootstrap.js +1 -0
  57. package/dist/app/api/test/process.js +1 -0
  58. package/dist/app/api/test/queues.js +1 -0
  59. package/dist/app/api/validate_input.js +1 -0
  60. package/dist/app/api/validate_session.js +1 -0
  61. package/dist/app/api/validate_type.js +1 -0
  62. package/dist/app/browser/hmr_client.js +1 -0
  63. package/dist/app/browser/process_polyfill.js +1 -0
  64. package/dist/app/cron_jobs/register.js +1 -0
  65. package/dist/app/databases/database_type_map.js +1 -0
  66. package/dist/app/databases/get_target_database_connection.js +1 -0
  67. package/dist/app/databases/mongodb/available_query_parameters.js +1 -0
  68. package/dist/app/databases/mongodb/build_connection_string.js +1 -0
  69. package/dist/app/databases/mongodb/build_query_parameters.js +1 -0
  70. package/dist/app/databases/mongodb/connect.js +6 -0
  71. package/dist/app/databases/mongodb/create_indexes.js +1 -0
  72. package/dist/app/databases/postgresql/accounts/create_accounts_metadata_table_columns.js +1 -0
  73. package/dist/app/databases/postgresql/connect.js +30 -0
  74. package/dist/app/databases/postgresql/create_indexes.js +1 -0
  75. package/dist/app/databases/postgresql/create_tables.js +1 -0
  76. package/dist/app/databases/postgresql/handle_cleanup_queues.js +5 -0
  77. package/dist/app/databases/postgresql/handle_cleanup_sessions.js +1 -0
  78. package/dist/app/databases/queries/accounts.js +1 -0
  79. package/dist/app/databases/queries/map.js +1 -0
  80. package/dist/app/databases/queries/mongodb/accounts.js +1 -0
  81. package/dist/app/databases/queries/mongodb/queues.js +1 -0
  82. package/dist/app/databases/queries/mongodb/sessions.js +1 -0
  83. package/dist/app/databases/queries/postgresql/accounts.js +1 -0
  84. package/dist/app/databases/queries/postgresql/queues.js +123 -0
  85. package/dist/app/databases/queries/postgresql/sessions.js +14 -0
  86. package/dist/app/databases/queries/sessions.js +1 -0
  87. package/dist/app/databases/register_database.js +1 -0
  88. package/dist/app/databases/sql.js +1 -0
  89. package/dist/app/email/send.js +1 -0
  90. package/dist/app/email/validate_smtp_settings.js +1 -0
  91. package/dist/app/fixture/index.js +1 -0
  92. package/dist/app/generate_machine_id.js +1 -0
  93. package/dist/app/generate_process_id.js +1 -0
  94. package/dist/app/get_ssl_certificates.js +1 -0
  95. package/dist/app/handle_process_errors.js +1 -0
  96. package/dist/app/index.js +1 -656
  97. package/dist/app/middleware/account.js +1 -0
  98. package/dist/app/middleware/body_parser.js +1 -0
  99. package/dist/app/middleware/build_error.js +1 -0
  100. package/dist/app/middleware/built_in.js +1 -0
  101. package/dist/app/middleware/context.js +1 -0
  102. package/dist/app/middleware/cors.js +1 -22
  103. package/dist/app/middleware/csp.js +1 -48
  104. package/dist/app/middleware/generate_insecure_page.js +65 -0
  105. package/dist/app/middleware/generate_joystick_error_page.js +147 -0
  106. package/dist/app/middleware/hmr_client.js +1 -0
  107. package/dist/app/middleware/insecure.js +1 -11
  108. package/dist/app/middleware/process_browser_polyfill.js +1 -0
  109. package/dist/app/middleware/render/get_url.js +1 -0
  110. package/dist/app/middleware/render/index.js +1 -0
  111. package/dist/app/middleware/request_methods.js +1 -0
  112. package/dist/app/middleware/session.js +1 -24
  113. package/dist/app/push_logs.js +1 -0
  114. package/dist/app/queues/index.js +1 -119
  115. package/dist/app/register_app_options.js +1 -0
  116. package/dist/app/routes/register_route_from_function.js +1 -0
  117. package/dist/app/routes/register_route_from_object.js +1 -0
  118. package/dist/app/routes/supported_http_methods.js +1 -0
  119. package/dist/app/settings/load.js +1 -0
  120. package/dist/app/ssr/index.js +33 -0
  121. package/dist/app/ssr/set_base_attributes_in_html.js +1 -0
  122. package/dist/app/ssr/set_head_tags_in_html.js +1 -0
  123. package/dist/app/start_express.js +1 -0
  124. package/dist/app/start_node_as_cluster.js +1 -0
  125. package/dist/app/uploaders/local_upload_progress_middleware.js +1 -0
  126. package/dist/app/uploaders/register.js +1 -0
  127. package/dist/app/uploaders/run_upload.js +1 -0
  128. package/dist/app/uploaders/validate_options.js +1 -0
  129. package/dist/app/uploaders/validate_uploads.js +1 -0
  130. package/dist/app/websockets/emit_event.js +1 -0
  131. package/dist/app/websockets/index.js +1 -0
  132. package/dist/app/websockets/register.js +1 -0
  133. package/dist/index.js +4 -76
  134. package/dist/lib/camel_pascal_to_snake.js +1 -0
  135. package/dist/lib/constants.js +1 -13
  136. package/dist/lib/dynamic_import.js +1 -0
  137. package/dist/lib/escape_html.js +1 -0
  138. package/dist/lib/escape_key_value_pair.js +1 -0
  139. package/dist/lib/float_to_decimal_place.js +1 -0
  140. package/dist/lib/generate_id.js +1 -0
  141. package/dist/lib/get_browser_safe_request.js +1 -0
  142. package/dist/lib/get_joystick_build_path.js +1 -0
  143. package/dist/lib/get_origin.js +1 -0
  144. package/dist/lib/get_platform_safe_path.js +1 -0
  145. package/dist/lib/get_sanitized_context.js +1 -0
  146. package/dist/lib/get_translations.js +1 -0
  147. package/dist/lib/hash_string.js +1 -0
  148. package/dist/lib/is_valid_json.js +1 -0
  149. package/dist/lib/log.js +13 -49
  150. package/dist/lib/node_path_polyfills.js +1 -0
  151. package/dist/lib/parse_json.js +1 -0
  152. package/dist/lib/path_exists.js +1 -0
  153. package/dist/lib/rainbow_road.js +1 -0
  154. package/dist/lib/serialize_query_parameters.js +1 -0
  155. package/dist/lib/set_cookie.js +1 -0
  156. package/dist/lib/string_to_slug.js +1 -0
  157. package/dist/lib/timestamps.js +1 -0
  158. package/dist/lib/types.js +1 -0
  159. package/dist/lib/unset_cookie.js +1 -0
  160. package/dist/lib/wait.js +1 -0
  161. package/dist/test/track_function_call.js +1 -0
  162. package/increment_version.js +3 -0
  163. package/package.json +27 -44
  164. package/src/action/class.js +137 -0
  165. package/src/action/index.js +8 -0
  166. package/src/app/accounts/default_user_output_fields.js +10 -0
  167. package/src/app/accounts/delete_user.js +18 -0
  168. package/src/app/accounts/generate_account_session.js +11 -0
  169. package/src/app/accounts/generate_password_reset_token.js +16 -0
  170. package/src/app/accounts/get_browser_safe_user.js +29 -0
  171. package/src/app/accounts/has_login_token_expired.js +9 -0
  172. package/src/app/accounts/index.js +38 -0
  173. package/src/app/accounts/login.js +82 -0
  174. package/src/app/accounts/recover_password.js +58 -0
  175. package/src/app/accounts/reset_password.js +69 -0
  176. package/src/app/accounts/roles/add.js +7 -0
  177. package/src/app/accounts/roles/grant.js +7 -0
  178. package/src/app/accounts/roles/index.js +18 -0
  179. package/src/app/accounts/roles/list.js +7 -0
  180. package/src/app/accounts/roles/remove.js +7 -0
  181. package/src/app/accounts/roles/revoke.js +7 -0
  182. package/src/app/accounts/roles/user_has_role.js +7 -0
  183. package/src/app/accounts/send_email_verification.js +48 -0
  184. package/src/app/accounts/set_account_cookie.js +12 -0
  185. package/src/app/accounts/set_password.js +46 -0
  186. package/src/app/accounts/signup.js +158 -0
  187. package/src/app/accounts/unset_account_cookie.js +12 -0
  188. package/src/app/accounts/verify_email.js +32 -0
  189. package/src/app/api/accounts/authenticated.js +17 -0
  190. package/src/app/api/accounts/login.js +36 -0
  191. package/src/app/api/accounts/logout.js +20 -0
  192. package/src/app/api/accounts/recover_password.js +16 -0
  193. package/src/app/api/accounts/reset_password.js +24 -0
  194. package/src/app/api/accounts/signup.js +49 -0
  195. package/src/app/api/accounts/user.js +21 -0
  196. package/src/app/api/accounts/verify_email.js +11 -0
  197. package/src/app/api/format_api_error.js +10 -0
  198. package/src/app/api/get.js +119 -0
  199. package/src/app/api/get_api_context.js +27 -0
  200. package/src/app/api/get_api_for_data_functions.js +37 -0
  201. package/src/app/api/get_api_url_component.js +5 -0
  202. package/src/app/api/get_output.js +116 -0
  203. package/src/app/api/get_value_from_object.js +8 -0
  204. package/src/app/api/handle_api_error.js +28 -0
  205. package/src/app/api/input_validators.js +227 -0
  206. package/src/app/api/is_array_path.js +6 -0
  207. package/src/app/api/push/health.js +17 -0
  208. package/src/app/api/register_getters.js +57 -0
  209. package/src/app/api/register_setters.js +55 -0
  210. package/src/app/api/sanitize_api_response.js +35 -0
  211. package/src/app/api/set.js +119 -0
  212. package/src/app/api/test/accounts/delete.js +8 -0
  213. package/src/app/api/test/accounts/signup.js +50 -0
  214. package/src/app/api/test/bootstrap.js +39 -0
  215. package/src/app/api/test/process.js +7 -0
  216. package/src/app/api/test/queues.js +25 -0
  217. package/src/app/api/validate_input.js +130 -0
  218. package/src/app/api/validate_session.js +20 -0
  219. package/src/app/api/validate_type.js +24 -0
  220. package/src/app/browser/hmr_client.js +196 -0
  221. package/src/app/browser/process_polyfill.js +11 -0
  222. package/src/app/cron_jobs/register.js +29 -0
  223. package/src/app/databases/database_type_map.js +6 -0
  224. package/src/app/databases/get_target_database_connection.js +25 -0
  225. package/{dist/app/databases/mongodb/availableQueryParameters.js → src/app/databases/mongodb/available_query_parameters.js} +3 -4
  226. package/src/app/databases/mongodb/build_connection_string.js +30 -0
  227. package/src/app/databases/mongodb/build_query_parameters.js +17 -0
  228. package/src/app/databases/mongodb/connect.js +42 -0
  229. package/src/app/databases/mongodb/create_indexes.js +35 -0
  230. package/src/app/databases/postgresql/accounts/create_accounts_metadata_table_columns.js +18 -0
  231. package/src/app/databases/postgresql/connect.js +128 -0
  232. package/src/app/databases/postgresql/create_indexes.js +58 -0
  233. package/src/app/databases/postgresql/create_tables.js +70 -0
  234. package/src/app/databases/postgresql/handle_cleanup_queues.js +36 -0
  235. package/src/app/databases/postgresql/handle_cleanup_sessions.js +5 -0
  236. package/src/app/databases/queries/accounts.js +17 -0
  237. package/src/app/databases/queries/map.js +21 -0
  238. package/src/app/databases/queries/mongodb/accounts.js +360 -0
  239. package/src/app/databases/queries/mongodb/queues.js +164 -0
  240. package/src/app/databases/queries/mongodb/sessions.js +22 -0
  241. package/src/app/databases/queries/postgresql/accounts.js +379 -0
  242. package/src/app/databases/queries/postgresql/queues.js +294 -0
  243. package/src/app/databases/queries/postgresql/sessions.js +37 -0
  244. package/src/app/databases/queries/sessions.js +17 -0
  245. package/src/app/databases/register_database.js +30 -0
  246. package/src/app/databases/sql.js +63 -0
  247. package/src/app/email/send.js +108 -0
  248. package/src/app/email/validate_smtp_settings.js +53 -0
  249. package/src/app/fixture/index.js +50 -0
  250. package/src/app/generate_machine_id.js +26 -0
  251. package/src/app/generate_process_id.js +30 -0
  252. package/src/app/get_ssl_certificates.js +23 -0
  253. package/src/app/handle_process_errors.js +101 -0
  254. package/src/app/index.js +253 -0
  255. package/src/app/middleware/account.js +28 -0
  256. package/src/app/middleware/body_parser.js +18 -0
  257. package/src/app/middleware/build_error.js +18 -0
  258. package/src/app/middleware/built_in.js +76 -0
  259. package/src/app/middleware/context.js +34 -0
  260. package/src/app/middleware/cors.js +23 -0
  261. package/src/app/middleware/csp.js +54 -0
  262. package/src/app/middleware/generate_insecure_page.js +71 -0
  263. package/{dist/lib/generateErrorPage.js → src/app/middleware/generate_joystick_error_page.js} +25 -21
  264. package/src/app/middleware/hmr_client.js +12 -0
  265. package/src/app/middleware/insecure.js +22 -0
  266. package/src/app/middleware/process_browser_polyfill.js +12 -0
  267. package/src/app/middleware/render/get_url.js +15 -0
  268. package/src/app/middleware/render/index.js +93 -0
  269. package/src/app/middleware/request_methods.js +21 -0
  270. package/src/app/middleware/session.js +31 -0
  271. package/src/app/push_logs.js +44 -0
  272. package/src/app/queues/index.js +268 -0
  273. package/src/app/register_app_options.js +7 -0
  274. package/src/app/routes/register_route_from_function.js +10 -0
  275. package/src/app/routes/register_route_from_object.js +34 -0
  276. package/src/app/routes/supported_http_methods.js +9 -0
  277. package/src/app/settings/load.js +33 -0
  278. package/src/app/ssr/index.js +133 -0
  279. package/src/app/ssr/set_base_attributes_in_html.js +43 -0
  280. package/src/app/ssr/set_head_tags_in_html.js +104 -0
  281. package/src/app/start_express.js +50 -0
  282. package/src/app/start_node_as_cluster.js +30 -0
  283. package/src/app/uploaders/local_upload_progress_middleware.js +24 -0
  284. package/src/app/uploaders/register.js +169 -0
  285. package/src/app/uploaders/run_upload.js +136 -0
  286. package/src/app/uploaders/validate_options.js +74 -0
  287. package/src/app/uploaders/validate_uploads.js +127 -0
  288. package/src/app/websockets/emit_event.js +14 -0
  289. package/src/app/websockets/index.js +16 -0
  290. package/src/app/websockets/register.js +175 -0
  291. package/src/index.js +81 -0
  292. package/{dist/lib/camelPascalToSnake.js → src/lib/camel_pascal_to_snake.js} +3 -4
  293. package/src/lib/constants.js +21 -0
  294. package/src/lib/dynamic_import.js +8 -0
  295. package/src/lib/escape_html.js +9 -0
  296. package/src/lib/escape_key_value_pair.js +15 -0
  297. package/src/lib/float_to_decimal_place.js +5 -0
  298. package/src/lib/generate_id.js +15 -0
  299. package/src/lib/get_browser_safe_request.js +17 -0
  300. package/src/lib/get_joystick_build_path.js +22 -0
  301. package/src/lib/get_origin.js +7 -0
  302. package/src/lib/get_platform_safe_path.js +8 -0
  303. package/src/lib/get_sanitized_context.js +51 -0
  304. package/src/lib/get_translations.js +109 -0
  305. package/src/lib/hash_string.js +7 -0
  306. package/src/lib/is_valid_json.js +10 -0
  307. package/src/lib/log.js +42 -0
  308. package/src/lib/node_path_polyfills.js +23 -0
  309. package/src/lib/parse_json.js +9 -0
  310. package/src/lib/path_exists.js +12 -0
  311. package/src/lib/rainbow_road.js +7 -0
  312. package/src/lib/serialize_query_parameters.js +7 -0
  313. package/src/lib/set_cookie.js +16 -0
  314. package/src/lib/string_to_slug.js +14 -0
  315. package/src/lib/timestamps.js +48 -0
  316. package/src/lib/types.js +59 -0
  317. package/src/lib/unset_cookie.js +11 -0
  318. package/src/lib/wait.js +9 -0
  319. package/src/test/track_function_call.js +16 -0
  320. package/README.md +0 -8
  321. package/_package.json +0 -63
  322. package/canary.js +0 -12
  323. package/dist/api/get.js +0 -29
  324. package/dist/api/getOrigin.js +0 -6
  325. package/dist/api/index.js +0 -9
  326. package/dist/api/set.js +0 -29
  327. package/dist/app/accounts/defaultUserOutputFields.js +0 -9
  328. package/dist/app/accounts/generateResetToken.js +0 -28
  329. package/dist/app/accounts/generateSession.js +0 -15
  330. package/dist/app/accounts/getBrowserSafeUser.js +0 -24
  331. package/dist/app/accounts/hasLoginTokenExpired.js +0 -17
  332. package/dist/app/accounts/hashString.js +0 -7
  333. package/dist/app/accounts/recoverPassword.js +0 -30
  334. package/dist/app/accounts/resetPassword.js +0 -73
  335. package/dist/app/accounts/roles/userHasRole.js +0 -7
  336. package/dist/app/accounts/runUserQuery.js +0 -15
  337. package/dist/app/accounts/sendEmailVerification.js +0 -65
  338. package/dist/app/accounts/setAuthenticationCookie.js +0 -11
  339. package/dist/app/accounts/setPassword.js +0 -45
  340. package/dist/app/accounts/unsetAuthenticationCookie.js +0 -11
  341. package/dist/app/accounts/verifyEmail.js +0 -46
  342. package/dist/app/databases/getTargetDatabase.js +0 -10
  343. package/dist/app/databases/getTargetDatabaseConnection.js +0 -19
  344. package/dist/app/databases/getTargetDatabaseProvider.js +0 -10
  345. package/dist/app/databases/mongodb/buildConnectionString.js +0 -22
  346. package/dist/app/databases/mongodb/buildQueryParameters.js +0 -14
  347. package/dist/app/databases/mongodb/index.js +0 -40
  348. package/dist/app/databases/mongodb/queries/accounts.js +0 -266
  349. package/dist/app/databases/mongodb/queries/queues.js +0 -111
  350. package/dist/app/databases/postgresql/addColumnToTable.js +0 -6
  351. package/dist/app/databases/postgresql/createAccountsIndexes.js +0 -21
  352. package/dist/app/databases/postgresql/createAccountsTables.js +0 -39
  353. package/dist/app/databases/postgresql/createDatabase.js +0 -0
  354. package/dist/app/databases/postgresql/index.js +0 -55
  355. package/dist/app/databases/postgresql/queries/accounts.js +0 -186
  356. package/dist/app/databases/postgresql/queries/queues.js +0 -211
  357. package/dist/app/databases/queryMap.js +0 -17
  358. package/dist/app/databases/typesMap.js +0 -7
  359. package/dist/app/getAPIContext.js +0 -25
  360. package/dist/app/getAPIURLComponent.js +0 -6
  361. package/dist/app/getBrowserSafeRequest.js +0 -14
  362. package/dist/app/getOutput.js +0 -74
  363. package/dist/app/handleProcessErrors.js +0 -73
  364. package/dist/app/initExpress.js +0 -41
  365. package/dist/app/middleware/bodyParser.js +0 -16
  366. package/dist/app/middleware/hmr/client.js +0 -113
  367. package/dist/app/middleware/index.js +0 -89
  368. package/dist/app/middleware/render.js +0 -213
  369. package/dist/app/middleware/requestMethods.js +0 -19
  370. package/dist/app/registerGetters.js +0 -45
  371. package/dist/app/registerSetters.js +0 -45
  372. package/dist/app/runGetter.js +0 -103
  373. package/dist/app/runSetter.js +0 -103
  374. package/dist/app/runUploader.js +0 -143
  375. package/dist/app/sanitizeAPIResponse.js +0 -27
  376. package/dist/app/utils/process.js +0 -193
  377. package/dist/app/validateSession.js +0 -19
  378. package/dist/app/validateUploaderOptions.js +0 -53
  379. package/dist/app/validateUploads.js +0 -102
  380. package/dist/email/render.js +0 -50
  381. package/dist/email/send.js +0 -55
  382. package/dist/email/templates/base.css +0 -194
  383. package/dist/email/templates/base.html +0 -28
  384. package/dist/email/templates/reset-password.js +0 -13
  385. package/dist/email/validateSMTPSettings.js +0 -27
  386. package/dist/lib/escapeHTML.js +0 -9
  387. package/dist/lib/escapeKeyValuePair.js +0 -13
  388. package/dist/lib/formatAPIError.js +0 -12
  389. package/dist/lib/formatErrorString.js +0 -8
  390. package/dist/lib/generateCookie.js +0 -14
  391. package/dist/lib/generateId.js +0 -13
  392. package/dist/lib/generateMachineId.js +0 -15
  393. package/dist/lib/getBuildPath.js +0 -10
  394. package/dist/lib/getErrorObject.js +0 -9
  395. package/dist/lib/getPlatformSafeFilePath.js +0 -8
  396. package/dist/lib/getPlatformSafePath.js +0 -8
  397. package/dist/lib/getSSLCertificates.js +0 -19
  398. package/dist/lib/isValidHTTPMethod.js +0 -7
  399. package/dist/lib/isValidJSONString.js +0 -11
  400. package/dist/lib/nodeUrlPolyfills.js +0 -14
  401. package/dist/lib/objectToSQLKeysString.js +0 -18
  402. package/dist/lib/objectToSQLValuesString.js +0 -16
  403. package/dist/lib/obscenedb/debounce.js +0 -12
  404. package/dist/lib/obscenedb/index.js +0 -61
  405. package/dist/lib/parseDatabasesFromEnvironment.js +0 -9
  406. package/dist/lib/rainbowRoad.js +0 -7
  407. package/dist/lib/readDirectory.js +0 -24
  408. package/dist/lib/replaceBackslashesWithForwardSlashes.js +0 -8
  409. package/dist/lib/replaceFileProtocol.js +0 -8
  410. package/dist/lib/replaceForwardSlashesWithBackslashes.js +0 -8
  411. package/dist/lib/serializeQueryParameters.js +0 -8
  412. package/dist/lib/serverAvailable.js +0 -0
  413. package/dist/lib/setCookie.js +0 -16
  414. package/dist/lib/supportedHTTPMethods.js +0 -4
  415. package/dist/lib/unsetCookie.js +0 -13
  416. package/dist/push/logs/index.js +0 -55
  417. package/dist/settings/index.js +0 -5
  418. package/dist/settings/load.js +0 -30
  419. package/dist/ssr/compileCSS.js +0 -85
  420. package/dist/ssr/findComponentInTree.js +0 -29
  421. package/dist/ssr/formatCSS.js +0 -6
  422. package/dist/ssr/getCSSFromTree.js +0 -33
  423. package/dist/ssr/index.js +0 -441
  424. package/dist/ssr/replaceWhenTags.js +0 -37
  425. package/dist/ssr/setHeadTagsInHTML.js +0 -84
  426. package/dist/validation/index.js +0 -10
  427. package/dist/validation/index.test.js +0 -463
  428. package/dist/validation/inputWithSchema/index.js +0 -105
  429. package/dist/validation/lib/constants.js +0 -162
  430. package/dist/validation/lib/getValueFromObject.js +0 -12
  431. package/dist/validation/lib/getValueFromObject.test.js +0 -7
  432. package/dist/validation/lib/isArrayPath.js +0 -6
  433. package/dist/validation/lib/throwError.js +0 -6
  434. package/dist/validation/lib/typeValidators.js +0 -38
  435. package/dist/validation/lib/validateType.js +0 -33
  436. package/dist/validation/schema/index.js +0 -44
  437. package/dist/websockets/emitWebsocketEvent.js +0 -12
  438. package/dist/websockets/index.js +0 -12
  439. package/notes +0 -1
@@ -0,0 +1,128 @@
1
+ import chalk from "chalk";
2
+ import fs from 'fs';
3
+ import os from 'os';
4
+ import postgresql from 'pg';
5
+ import sql from '../sql.js';
6
+
7
+ const { Pool } = postgresql;
8
+
9
+ const connect_postgresql = async (database_settings = {}, database_port = 2610) => {
10
+ const connection = database_settings?.connection || {
11
+ hosts: [
12
+ { hostname: "127.0.0.1", port: database_port },
13
+ ],
14
+ database: "app",
15
+ // NOTE: PostgreSQL creates a default superuser based on the OS username.
16
+ username: (os.userInfo() || {}).username || "",
17
+ password: "",
18
+ };
19
+
20
+ try {
21
+ const host = connection.hosts && connection.hosts[0];
22
+ const connection_config = {
23
+ user: connection?.username || '',
24
+ database: connection?.database,
25
+ password: connection?.password || '',
26
+ host: host?.hostname,
27
+ port: host?.port,
28
+ ...(database_settings?.options || {})
29
+ };
30
+
31
+ if (database_settings?.options?.ssl?.ca) {
32
+ connection_config.ssl = {
33
+ ca: fs.readFileSync(database_settings?.options?.ssl?.ca),
34
+ };
35
+ }
36
+
37
+ const pool = new Pool(connection_config);
38
+
39
+ return {
40
+ pool,
41
+ query: (...args) => {
42
+ return pool.query(...args).then((response) => {
43
+ return response?.rows || [];
44
+ }).catch((error) => {
45
+ console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
46
+ console.log(args[0]);
47
+ console.log(`\n`);
48
+ console.log(chalk.redBright(`\nFailed Values:\n`));
49
+ console.log(args[1]);
50
+
51
+ throw error;
52
+ });
53
+ },
54
+ add_column: (options = {}) => {
55
+ const column = sql.add_column(options);
56
+ return pool.query(column.statement).then((response) => {
57
+ return response?.rows || [];
58
+ }).catch((error) => {
59
+ console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
60
+ console.log(column.statement);
61
+
62
+ throw error;
63
+ });
64
+ },
65
+ create_table: (options = {}) => {
66
+ const table = sql.create_table(options);
67
+ return pool.query(table.statement).then((response) => {
68
+ return response?.rows || [];
69
+ }).catch((error) => {
70
+ console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
71
+ console.log(table.statement);
72
+
73
+ throw error;
74
+ });
75
+ },
76
+ insert: (options = {}) => {
77
+ const insert = sql.insert(options);
78
+ return pool.query(insert.statement, insert.values).then((response) => {
79
+ return response?.rows || [];
80
+ }).catch((error) => {
81
+ console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
82
+ console.log(insert.statement);
83
+ console.log(`\n`);
84
+ console.log(chalk.redBright(`\nFailed Values:\n`));
85
+ console.log(insert.values);
86
+
87
+ throw error;
88
+ });
89
+ },
90
+ select: (options = {}) => {
91
+ const select = sql.select(options);
92
+ return pool.query(select.statement, select.values).then((response) => {
93
+ return response?.rows || [];
94
+ }).catch((error) => {
95
+ console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
96
+ console.log(select.statement);
97
+ console.log(`\n`);
98
+ console.log(chalk.redBright(`\nFailed Values:\n`));
99
+ console.log(select.where);
100
+
101
+ throw error;
102
+ });
103
+ },
104
+ update: (options = {}) => {
105
+ const update = sql.update(options);
106
+ return pool.query(update.statement, update.values).then((response) => {
107
+ return response?.rows || [];
108
+ }).catch((error) => {
109
+ console.log(chalk.redBright(`\nFailed SQL Statement:\n`));
110
+ console.log(update.statement);
111
+ console.log(`\n`);
112
+ console.log(chalk.redBright(`\nFailed Values:\n`));
113
+ console.log(update.values);
114
+
115
+ throw error;
116
+ });
117
+ },
118
+ };
119
+ } catch (exception) {
120
+ console.warn(
121
+ chalk.yellowBright(
122
+ `\nFailed to connect to PostgreSQL. Please double-check connection settings and try again.\n\nError from PostgreSQL:\n\n${chalk.redBright(exception?.message)}`
123
+ ),
124
+ );
125
+ }
126
+ };
127
+
128
+ export default connect_postgresql;
@@ -0,0 +1,58 @@
1
+ import cron from 'node-cron';
2
+ import types from "../../../lib/types.js";
3
+ import handle_cleanup_sessions from "./handle_cleanup_sessions.js";
4
+
5
+ const create_unique_index = async (target_database = '', index_name = '', table_name = '', table_columns = []) => {
6
+ return process.databases[target_database]?.query(`CREATE UNIQUE INDEX IF NOT EXISTS ${index_name} ON ${table_name}(${table_columns.join(', ')})`);
7
+ };
8
+
9
+ const create_index = async (target_database = '', index_name = '', table_name = '', table_columns = []) => {
10
+ return process.databases[target_database]?.query(`CREATE INDEX IF NOT EXISTS ${index_name} ON ${table_name}(${table_columns.join(', ')})`);
11
+ };
12
+
13
+ const indexes = {
14
+ // NOTE: queue indexes are set dynamically when initializing the queue in
15
+ // app/databases/queries/<provider>/queues.js initialize_database function
16
+ // to account for developer customization options.
17
+ sessions: async () => {
18
+ await create_index('_sessions', 'session_by_id', 'sessions', ['session_id']);
19
+ await create_index('_sessions', 'session_created_at', 'sessions', ['created_at']);
20
+
21
+ // NOTE: Simulate a TTL index using cron to wipe out sessions older than 1 hour.
22
+ cron.schedule('*/30 * * * * *', () => {
23
+ handle_cleanup_sessions();
24
+ });
25
+ },
26
+ users: async () => {
27
+ // users
28
+ await create_index('_users', 'user_by_email', 'users', ['email_address']);
29
+ await create_index('_users', 'user_by_username', 'users', ['username']);
30
+ await create_index('_users', 'user_by_user_id', 'users', ['user_id']);
31
+
32
+ // users_sessions
33
+ await create_index('user_session_by_token', 'users_sessions', ['token']);
34
+
35
+ // users_password_reset_tokens
36
+ await create_index('_users', 'user_password_reset_token_by_token', 'users_password_reset_tokens', ['token']);
37
+ await create_index('_users', 'user_password_reset_token_by_user_id_token', 'users_password_reset_tokens', ['user_id', 'token']);
38
+
39
+ // users_roles
40
+ await create_index('_users', 'user_role', 'users_roles', ['role']);
41
+ await create_index('_users', 'user_roles_by_user_id_role', 'users_roles', ['user_id', 'role']);
42
+
43
+ // roles
44
+ await create_index('_users', 'role', 'roles', ['role']);
45
+ await create_unique_index('_users', 'user_roles', 'users_roles', ['user_id', 'role']);
46
+ },
47
+ };
48
+
49
+ const create_indexes = async (database_types_to_index = []) => {
50
+ for (let i = 0; i < database_types_to_index?.length; i += 1) {
51
+ const database_type = database_types_to_index[i];
52
+ if (types.is_function(indexes[database_type])) {
53
+ await indexes[database_type]();
54
+ }
55
+ }
56
+ };
57
+
58
+ export default create_indexes;
@@ -0,0 +1,70 @@
1
+ import types from "../../../lib/types.js";
2
+
3
+ const create_table = (target_database = '', table_name = '', table_columns = []) => {
4
+ return process.databases[target_database]?.query(
5
+ `CREATE TABLE IF NOT EXISTS ${table_name} (${table_columns.join(", ")})`
6
+ );
7
+ };
8
+
9
+ const tables = {
10
+ // NOTE: queue tables are created dynamically when initializing the queue in
11
+ // app/databases/queries/<provider>/queues.js initialize_database function
12
+ // to account for dynamic table names.
13
+ sessions: async () => {
14
+ await create_table('_sessions', 'sessions', [
15
+ 'id bigserial primary key',
16
+ 'session_id text',
17
+ 'csrf text',
18
+ 'created_at text'
19
+ ]);
20
+ },
21
+ users: async () => {
22
+ await create_table('_users', 'users', [
23
+ 'id bigserial primary key',
24
+ 'user_id text',
25
+ 'email_address text',
26
+ 'password text',
27
+ 'username text',
28
+ 'language text',
29
+ ]);
30
+
31
+ await create_table('_users', 'users_sessions', [
32
+ 'id bigserial primary key',
33
+ 'user_id text',
34
+ 'token text',
35
+ 'token_expires_at text',
36
+ ]);
37
+
38
+ await create_table('_users', 'users_password_reset_tokens', [
39
+ 'id bigserial primary key',
40
+ 'user_id text',
41
+ 'token text',
42
+ 'requested_at text',
43
+ ]);
44
+
45
+ await create_table('_users', 'users_verify_email_tokens', [
46
+ 'id bigserial primary key',
47
+ 'user_id text',
48
+ 'token text',
49
+ ]);
50
+
51
+ await create_table('_users', 'roles', ['id bigserial primary key', 'role text']);
52
+
53
+ await create_table('_users', 'users_roles', [
54
+ 'id bigserial primary key',
55
+ 'user_id text',
56
+ 'role text',
57
+ ]);
58
+ },
59
+ };
60
+
61
+ const create_tables = async (database_types_to_index = []) => {
62
+ for (let i = 0; i < database_types_to_index?.length; i += 1) {
63
+ const database_type = database_types_to_index[i];
64
+ if (types.is_function(tables[database_type])) {
65
+ await tables[database_type]();
66
+ }
67
+ }
68
+ };
69
+
70
+ export default create_tables;
@@ -0,0 +1,36 @@
1
+ import timestamps from "../../../lib/timestamps.js";
2
+
3
+ const handle_cleanup_queues = async ({
4
+ database = {},
5
+ table = '',
6
+ seconds = 0,
7
+ }) => {
8
+ const jobs_with_status = await database.query(`
9
+ SELECT * FROM ${table} WHERE status = ANY($1) AND environment = $2
10
+ `, [
11
+ ['completed', 'failed'],
12
+ process.env.NODE_ENV,
13
+ ]);
14
+
15
+ const jobs_to_cleanup = jobs_with_status?.filter((job = {}) => {
16
+ if (job?.status === 'completed') {
17
+ const completed_at_with_seconds = timestamps.get_future_time('seconds', seconds, { start_from: job?.completed_at });
18
+ return completed_at_with_seconds <= timestamps.get_current_time();
19
+ }
20
+
21
+ if (job?.status === 'failed') {
22
+ const failed_at_with_seconds = timestamps.get_future_time('seconds', seconds, { start_from: job?.failed_at });
23
+ return failed_at_with_seconds <= timestamps.get_current_time();
24
+ }
25
+
26
+ return false;
27
+ });
28
+
29
+ await database.query(`
30
+ DELETE FROM ${table} WHERE _id = ANY($1)
31
+ `, [
32
+ jobs_to_cleanup?.map(({ _id }) => _id)
33
+ ]);
34
+ };
35
+
36
+ export default handle_cleanup_queues;
@@ -0,0 +1,5 @@
1
+ const handle_cleanup_sessions = async () => {
2
+ await process.databases._sessions.query(`DELETE FROM sessions where created_at::timestamp <= timezone('utc', now() - interval '1 hour')`);
3
+ };
4
+
5
+ export default handle_cleanup_sessions;
@@ -0,0 +1,17 @@
1
+ import get_target_database_connection from "../get_target_database_connection.js";
2
+ import query_map from "./map.js";
3
+
4
+ const accounts_query = async (query_name = "", inputs = {}) => {
5
+ const users_database = get_target_database_connection('users');
6
+ const query_map_for_database = users_database && query_map && query_map[users_database?.provider] && query_map[users_database?.provider]?.accounts;
7
+ const query = query_map_for_database && query_map_for_database[query_name];
8
+
9
+ if (users_database?.connection && query) {
10
+ const response = await query_map_for_database[query_name](inputs, users_database?.connection);
11
+ return Promise.resolve(response);
12
+ }
13
+
14
+ return null;
15
+ };
16
+
17
+ export default accounts_query;
@@ -0,0 +1,21 @@
1
+ import mongodb_accounts_queries from './mongodb/accounts.js';
2
+ import mongodb_queues_queries from './mongodb/queues.js';
3
+ import mongodb_sessions_queries from './mongodb/sessions.js';
4
+ import postgresql_accounts_queries from './postgresql/accounts.js';
5
+ import postgresql_queues_queries from './postgresql/queues.js';
6
+ import postgresql_sessions_queries from './postgresql/sessions.js';
7
+
8
+ const map = {
9
+ mongodb: {
10
+ accounts: mongodb_accounts_queries,
11
+ queues: mongodb_queues_queries,
12
+ sessions: mongodb_sessions_queries,
13
+ },
14
+ postgresql: {
15
+ accounts: postgresql_accounts_queries,
16
+ queues: postgresql_queues_queries,
17
+ sessions: postgresql_sessions_queries,
18
+ },
19
+ };
20
+
21
+ export default map;
@@ -0,0 +1,360 @@
1
+ import generate_id from "../../../../lib/generate_id.js";
2
+
3
+ const accounts = {
4
+ add_password_reset_token: (input = {}) => {
5
+ return process.databases._users?.collection("users").updateOne({
6
+ emailAddress: input.email_address,
7
+ }, {
8
+ $addToSet: {
9
+ passwordResetTokens: {
10
+ token: input.token,
11
+ requestedAt: new Date().toISOString(),
12
+ },
13
+ },
14
+ });
15
+ },
16
+ add_role: async (input = {}) => {
17
+ const existing_role = input?.role
18
+ ? await process.databases._users?.collection("roles").findOne({ role: input?.role })
19
+ : null;
20
+
21
+ if (!existing_role && input?.role) {
22
+ await process.databases._users?.collection("roles").insertOne({
23
+ _id: generate_id(16),
24
+ role: input?.role,
25
+ });
26
+
27
+ return {
28
+ _id: input?.user_id,
29
+ action: "add",
30
+ role: input?.role,
31
+ ok: true,
32
+ error: null,
33
+ };
34
+ }
35
+
36
+ return {
37
+ action: "add",
38
+ role: input?.role,
39
+ ok: false,
40
+ error: input?.role
41
+ ? `Role already exists: ${input?.role}.`
42
+ : `Must pass a name for role to add.`,
43
+ };
44
+ },
45
+ add_session: async (input = {}) => {
46
+ await process.databases._users?.collection("users").updateOne({
47
+ _id: input.user_id,
48
+ }, {
49
+ $addToSet: {
50
+ sessions: input.session,
51
+ },
52
+ });
53
+ },
54
+ create_email_verification_token: async (input = {}) => {
55
+ const token = generate_id(16);
56
+
57
+ await process.databases._users?.collection("users").updateOne({
58
+ _id: input?.user_id,
59
+ }, {
60
+ $addToSet: {
61
+ verifyEmailTokens: {
62
+ userId: input?.user_id,
63
+ token,
64
+ },
65
+ },
66
+ });
67
+
68
+ return token;
69
+ },
70
+ create_user: async (input = {}) => {
71
+ const user_id = generate_id(16);
72
+ await process.databases._users?.collection("users").insertOne({
73
+ _id: user_id,
74
+ ...input,
75
+ sessions: [],
76
+ });
77
+
78
+ return user_id;
79
+ },
80
+ delete_old_sessions: async (input = {}) => {
81
+ const user = await process.databases._users?.collection('users').findOne({
82
+ _id: input?.user_id,
83
+ });
84
+
85
+ if (user) {
86
+ const sessions = user?.sessions?.filter((session) => {
87
+ // NOTE: If tokenExpiresAt is after today, it hasn't expired yet, so keep it.
88
+ return new Date(session?.tokenExpiresAt || session?.token_expires_at).toISOString() > new Date().toISOString();
89
+ });
90
+
91
+ await process.databases._users?.collection("users").updateOne({
92
+ _id: input.user_id,
93
+ }, {
94
+ $set: {
95
+ sessions,
96
+ },
97
+ });
98
+ }
99
+ },
100
+ delete_user: async (input = {}) => {
101
+ return process.databases._users?.collection('users').deleteOne({
102
+ _id: input?.user_id,
103
+ });
104
+ },
105
+ existing_user: async (input = {}) => {
106
+ let existing_user_with_email_address;
107
+ let existing_user_with_username;
108
+
109
+ if (input?.email_address) {
110
+ existing_user_with_email_address = await process.databases._users?.collection("users").findOne({ emailAddress: input.email_address });
111
+ }
112
+
113
+ if (input?.username) {
114
+ existing_user_with_username = await process.databases._users?.collection("users").findOne({ username: input.username });
115
+ }
116
+
117
+ return existing_user_with_email_address || existing_user_with_username ? {
118
+ existing_email_address: existing_user_with_email_address?.emailAddress,
119
+ existing_username: existing_user_with_username?.username,
120
+ } : null;
121
+ },
122
+ get_existing_session: async (input = {}) => {
123
+ const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
124
+
125
+ if (user?.sessions?.length > 0) {
126
+ const sessions_by_last_to_expire = user?.sessions.sort((a, b) => {
127
+ return (a.tokenExpiresAt || a.token_expires_at) > (b.tokenExpiresAt || b.token_expires_at) ? -1 : 1;
128
+ });
129
+
130
+ return sessions_by_last_to_expire.shift();
131
+ }
132
+
133
+ return null;
134
+ },
135
+ get_password_reset_token: async (input = {}) => {
136
+ const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
137
+
138
+ if (user) {
139
+ return user?.passwordResetTokens && user?.passwordResetTokens[0]?.token || null;
140
+ }
141
+
142
+ return null;
143
+ },
144
+ grant_role: async (input = {}) => {
145
+ const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
146
+
147
+ if (user) {
148
+ await process.databases._users?.collection("users").updateOne({
149
+ _id: input?.user_id
150
+ }, {
151
+ $addToSet: {
152
+ roles: input?.role,
153
+ },
154
+ });
155
+
156
+ const existing_role = await process.databases._users?.collection("roles").findOne({ role: input?.role });
157
+
158
+ if (!existing_role) {
159
+ await process.databases._users?.collection("roles").insertOne({
160
+ _id: generate_id(16),
161
+ role: input?.role,
162
+ });
163
+ }
164
+
165
+ return {
166
+ _id: input?.user_id,
167
+ action: "grant",
168
+ role: input?.role,
169
+ ok: true,
170
+ error: null,
171
+ };
172
+ }
173
+
174
+ return {
175
+ _id: input?.user_id,
176
+ action: "grant",
177
+ role: input?.role,
178
+ ok: false,
179
+ error: `User not found with the _id ${input?.user_id}.`,
180
+ };
181
+ },
182
+ list_roles: async () => {
183
+ const roles = await process.databases._users?.collection("roles").find().toArray();
184
+ return (roles || []).map(({ role }) => role);
185
+ },
186
+ mark_email_verified_at: async (input = {}) => {
187
+ const user = await process.databases._users?.collection("users").findOne({
188
+ _id: input?.user_id,
189
+ });
190
+
191
+ await process.databases._users?.collection("users").updateOne({
192
+ _id: input?.user_id,
193
+ }, {
194
+ $set: {
195
+ emailVerified: true,
196
+ emailVerifiedAt: new Date().toISOString(),
197
+ verifyEmailTokens: user?.verifyEmailTokens?.filter(
198
+ (verify_email_token) => {
199
+ return verify_email_token?.token === input?.token;
200
+ }
201
+ ),
202
+ },
203
+ });
204
+
205
+ return true;
206
+ },
207
+ remove_reset_token: async (input = {}) => {
208
+ const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
209
+
210
+ await process.databases._users?.collection("users").updateOne({
211
+ _id: input?.user_id,
212
+ }, {
213
+ $set: {
214
+ passwordResetTokens: user?.passwordResetTokens?.filter(
215
+ ({ token }) => {
216
+ return token !== input?.token;
217
+ }
218
+ ),
219
+ },
220
+ });
221
+
222
+ return process.databases._users?.collection("users").findOne({ _id: input?.user_id });
223
+ },
224
+ remove_role: async (input = {}) => {
225
+ const existing_role = input?.role
226
+ ? await process.databases._users?.collection("roles").findOne({ role: input?.role })
227
+ : null;
228
+
229
+ if (existing_role) {
230
+ await process.databases._users?.collection("users").updateMany({
231
+ roles: { $in: [input?.role] },
232
+ }, {
233
+ $pull: {
234
+ roles: input?.role,
235
+ },
236
+ });
237
+
238
+ await process.databases._users?.collection("roles").deleteOne({
239
+ role: input?.role,
240
+ });
241
+
242
+ return {
243
+ _id: input?.user_id,
244
+ action: "remove",
245
+ role: input?.role,
246
+ ok: true,
247
+ error: null,
248
+ };
249
+ }
250
+
251
+ return {
252
+ action: "add",
253
+ role: input?.role,
254
+ ok: false,
255
+ error: `Could not find an existing role with the name ${input?.role}.`,
256
+ };
257
+ },
258
+ reset_user_sessions: async (input = {}) => {
259
+ const user = await process.databases._users?.collection('users').findOne({
260
+ _id: input?.user_id,
261
+ });
262
+
263
+ if (user) {
264
+ await process.databases._users?.collection("users").updateOne({
265
+ _id: input.user_id,
266
+ }, {
267
+ $set: {
268
+ sessions: [],
269
+ },
270
+ });
271
+ }
272
+ },
273
+ revoke_role: async (input = {}) => {
274
+ const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
275
+ if (user && user.roles) {
276
+ await process.databases._users?.collection("users").updateOne({
277
+ _id: input?.user_id
278
+ }, {
279
+ $pull: {
280
+ roles: input?.role,
281
+ },
282
+ });
283
+
284
+ return {
285
+ _id: input?.user_id,
286
+ action: "revoke",
287
+ role: input?.role,
288
+ ok: true,
289
+ error: null,
290
+ };
291
+ }
292
+
293
+ return {
294
+ _id: input?.user_id,
295
+ action: "revoke",
296
+ role: input?.role,
297
+ ok: false,
298
+ error: `User not found with the _id ${input?.user_id}.`,
299
+ };
300
+ },
301
+ set_new_password: async (input = {}) => {
302
+ return process.databases._users?.collection("users").updateOne({
303
+ _id: input?.user_id,
304
+ }, {
305
+ $set: {
306
+ password: input?.hashed_password,
307
+ },
308
+ });
309
+ },
310
+ user: async (input = {}) => {
311
+ if (input?.email_address) {
312
+ const user = await process.databases._users?.collection("users").findOne({ emailAddress: input.email_address });
313
+ return user;
314
+ }
315
+
316
+ if (input?.username) {
317
+ const user = await process.databases._users?.collection("users").findOne({ username: input.username });
318
+ return user;
319
+ }
320
+
321
+ if (input?._id) {
322
+ const user = await process.databases._users?.collection("users").findOne({ _id: input._id });
323
+ return user;
324
+ }
325
+
326
+ return null;
327
+ },
328
+ user_has_role: async (input = {}) => {
329
+ const user = await process.databases._users?.collection("users").findOne({ _id: input?.user_id });
330
+
331
+ if (user && user.roles) {
332
+ return user?.roles?.includes(input?.role);
333
+ }
334
+
335
+ return false;
336
+ },
337
+ user_with_login_token: async (input = {}) => {
338
+ const user = await process.databases._users?.collection("users").findOne({
339
+ "sessions.token": input?.token,
340
+ });
341
+
342
+ return user;
343
+ },
344
+ user_with_reset_token: async (input = {}) => {
345
+ const user = await process.databases._users?.collection("users").findOne({
346
+ "passwordResetTokens.token": input["passwordResetTokens.token"],
347
+ });
348
+
349
+ return user;
350
+ },
351
+ user_with_verify_email_token: async (input = {}) => {
352
+ const user = await process.databases._users?.collection("users").findOne({
353
+ "verifyEmailTokens.token": input?.token,
354
+ });
355
+
356
+ return user;
357
+ },
358
+ };
359
+
360
+ export default accounts;