@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 @@
1
+ const e=(t="")=>new RegExp(/\.[0-9]+\.?/g).test(t);var r=e;export{r as default};
@@ -0,0 +1,2 @@
1
+ import n from"fs";const{readFile:a}=n.promises,o=async(s={},t={})=>{const e=await a("/root/push/instance_token.txt","utf-8");return s?.headers["x-instance-token"]===e?.replace(`
2
+ `,"")?t.status(200).send("ok"):t.status(403).send("Sorry, you must pass a valid instance token to access this endpoint.")};var i=o;export{i as default};
@@ -0,0 +1 @@
1
+ import g from"./format_api_error.js";import y from"./get.js";import h from"./get_api_context.js";import w from"./get_api_url_component.js";import v from"./handle_api_error.js";import _ from"../../lib/is_valid_json.js";import x from"../../lib/types.js";import J from"./validate_session.js";const N=(d={},n=[],m={},u={})=>{for(let r=0;r<n?.length;r+=1){const[s,i]=n[r];d.get(`/api/_getters/${w(s)}`,...x.is_array(i?.middleware)?i?.middleware:[],async(e={},t={})=>{if(process.databases?._sessions&&!await J(e,t))return t.status(403).send(JSON.stringify({errors:[g(new Error("Unauthorized request."))]}));const c=await h(e,t,m),a=decodeURIComponent(e?.query?.input),f=_(a)?JSON.parse(a):null,p=decodeURIComponent(e?.query?.output),l=_(p)?JSON.parse(p):null;y({get_name:s,get_options:{input:f,output:l},getter_definition:i,request_context:c,api_schema_options:u}).then(o=>t.status(200).send(JSON.stringify(o))).catch(o=>{v(`api.getters.${s}`,o,t)})})}};var j=N;export{j as default};
@@ -0,0 +1 @@
1
+ import c from"./format_api_error.js";import f from"./get_api_context.js";import l from"./get_api_url_component.js";import y from"./handle_api_error.js";import g from"./set.js";import h from"../../lib/types.js";import w from"./validate_session.js";const x=(a={},n=[],p={},_={})=>{for(let o=0;o<n?.length;o+=1){const[r,i]=n[o];a.post(`/api/_setters/${l(r)}`,...h.is_array(i?.middleware)?i?.middleware:[],async(s={},t={})=>{if(process.databases?._sessions&&!await w(s,t))return t.status(403).send(JSON.stringify({errors:[c(new Error("Unauthorized request."))]}));const m=await f(s,t,p),u=s?.body?.input||null,d=s?.body?.output||null;g({set_name:r,set_options:{input:u,output:d},setter_definition:i,request_context:m,api_schema_options:_}).then(e=>t.status(200).send(JSON.stringify(e))).catch(e=>{y(`api.setters.${r}`,e,t)})})}};var z=x;export{z as default};
@@ -0,0 +1 @@
1
+ import _ from"../../lib/escape_html.js";import i from"../../lib/types.js";const e=(s=null)=>{let r=s;return!i.is_string(r)&&!i.is_object(r)&&!i.is_array(r)||(i.is_string(r)&&(r=_(r)?.trim()),i.is_object(r)&&!i.is_array(r)&&(r=Object.entries(r||{})?.reduce((t={},[a,n])=>(t[a]=e(n),t),{})),i.is_array(r)&&(r=r.map((t=null)=>e(t)))),r};var f=e;export{f as default};
@@ -0,0 +1,2 @@
1
+ import p from"./format_api_error.js";import f from"./get_output.js";import h from"../../lib/get_sanitized_context.js";import z from"./sanitize_api_response.js";import d from"../../test/track_function_call.js";import s from"../../lib/types.js";import m from"./validate_input.js";const _=async(o="",t={},r={},n={},a={},u={})=>{const c=t?.sanitize===!1,i=(t?.sanitize||u?.sanitize)===!0;d(`node.api.setters.${o}`,[r,h(a)]);const e=await t?.set(r,a),l=n?f(e,n):e;return!c&&i?z(l):l},g=async(o="",t={},r={},n={})=>{d(`node.api.setters.${o}.authorized`,[r,h(n)]);const a=await t?.authorized(r,n);if(typeof a=="boolean")return a;if(s.is_object(a)&&!s.is_array(a)&&!s.is_undefined(a?.authorized))return a?.authorized?!0:a?.message},w=(o=[],t="")=>{console.log(`Input validation for setter "${t}" failed with the following errors:
2
+ `);for(let r=0;r<o?.length;r+=1){const n=o[r];console.log(`${r+1}. ${n}`)}},y=(o={},t={})=>m(o,t),$=async({set_name:o,set_options:t,setter_definition:r,request_context:n,api_schema_options:a})=>{const u=r?.input&&Object.keys(r?.input)?.length>0,c=s.is_function(r?.authorized);if(u){const i=await y(t?.input,r?.input);if(i?.length>0)return w(i,o),Promise.reject({errors:i.map(e=>p(new Error(e),`setters.${o}.input`,401))})}if(c){const i=await g(o,r,t?.input,n);if(!i||s.is_string(i))return Promise.reject({errors:[p(new Error(typeof i=="string"?i:`Not authorized to access ${o}.`),`setters.${o}.authorized`,403)]})}if(s.is_function(r?.set)){const i=await _(o,r,t?.input,t?.output,n,a);return Promise.resolve(i)}};var N=$;export{N as default};
@@ -0,0 +1 @@
1
+ import s from"../../../databases/queries/accounts.js";const a=async(e={},t={})=>{await s("delete_user",{user_id:e?.body?.user_id}),t.status(200).send({data:{}})};var u=a;export{u as default};
@@ -0,0 +1 @@
1
+ import r from"../../../databases/queries/accounts.js";import m from"../../../accounts/default_user_output_fields.js";import p from"../../format_api_error.js";import d from"../../handle_api_error.js";import c from"../../validate_input.js";import y from"../../../accounts/signup.js";const l=async(t={},s={})=>{try{const a=await r("user",{email_address:t?.body?.emailAddress||t?.body?.email_address}),u=await r("user",{username:t?.body?.username}),e=a||u;e&&await r("delete_user",{user_id:e?._id||e?.user_id});const i=process.joystick?.app_options?.accounts?.signup?.metadata,n=i?await c(t?.body?.metadata,i):[];if(n?.length>0)return d("accounts.signup",{errors:n.map(_=>p(new Error(_),"accounts.signup.metadata",401))},s);const o=await y({email_address:t?.body?.emailAddress||t?.body?.email_address,username:t?.body?.username,password:t?.body?.password,metadata:t?.body?.metadata,output:t?.body?.output||m});s.status(200).send(JSON.stringify({...o?.user||{},joystick_login_token:o?.token,joystick_login_token_expires_at:o?.token_expires_at}))}catch(a){d("test.accounts.signup",a,s)}};var x=l;export{x as default};
@@ -0,0 +1 @@
1
+ import p from"../../../lib/dynamic_import.js";import c from"../get_api_for_data_functions.js";import m from"../../../lib/get_browser_safe_request.js";import d from"../../../lib/get_platform_safe_path.js";import f from"../../../lib/get_translations.js";import u from"../../settings/load.js";const l=async(t={},a={},_={})=>{const n=`${process.cwd()}/.joystick/build/`,s=t?.query?.path_to_component?await p(d(`${n}/${t?.query?.path_to_component}?v=${new Date().getTime()}`)):null;if(s){const o=s(),r=c(t,_?.options?.api),e=m(t),i=await o.fetch_data(r,e,{},o);return a.status(200).send({data:{[o?.id]:i},req:e,settings:u(),translations:await f({joystick_build_path:n,render_component_path:t?.query?.path_to_component,req:t})})}a.status(200).send({data:{},translations:{}})};var j=l;export{j as default};
@@ -0,0 +1 @@
1
+ const t=(e={},s={})=>{s.status(200).send({test:process?.test||{}})};var o=t;export{o as default};
@@ -0,0 +1 @@
1
+ const d=async(o={},t={},e={})=>{const u=process?.queues[o?.body?.queue],s=e?.options?.queues[o?.body?.queue]?.jobs[o?.body?.job];if(!u)return t.status(404).send({status:404,error:`Queue ${o?.body?.queue} not found.`});if(!s)return t.status(400).send({status:400,error:`Couldn't find a job called ${o?.body?.job} for the ${o?.body?.queue} queue.`});await u.handle_next_job({_id:"joystick_test",job:o?.body?.job,payload:o?.body?.payload}),t.status(200).send({status:200,data:{}})};var a=d;export{a as default};
@@ -0,0 +1 @@
1
+ import d from"./get_value_from_object.js";import y from"./input_validators.js";import b from"./is_array_path.js";import _ from"../../lib/types.js";const j=(t=null,r="",e=!1)=>{if(r&&!_.is_string(r))throw new Error("path must be passed as a string");if(e||!e&&!_.is_object(t))return t;if(r.includes(".$.")){const[o]=r.split(".$.");return d(t,o)}return d(t,r)},w=(t="")=>{if(!t)return"";if(t&&!_.is_string(t))throw new Error("array_path must be a type of string");return t.split(".").pop()},m=({queue:t,rules:r,input:e,path:o,types_only_schema:n})=>{r&&r.type==="object"&&(t=p(t,r.properties,e,o)),r&&r.type==="array"&&_.is_object(r.element)&&(t=p(t,r.element,e,`${o}.$`));const s=b(o)?w(o):o;return{path:o,rules:r,input_value:j(e,s,n)}},p=(t=[],r={},e={},o="")=>{const n=!!(r.type&&y.types.includes(r.type));if(!n){const s=Object.entries(r||{});for(let a=0;a<s?.length;a+=1){const[c,l]=s[a],i=m({queue:t,rules:l,input:e,path:c,types_only_schema:n});t=[...t,i]}}if(n){const s=m({queue:t,rules:r,input:e,path:o,types_only_schema:n});t=[...t,s]}return t},v=async(t={},r={},e="")=>{const o=[],n=p([],r,t,e);return await Promise.all(n.flatMap(s=>Object.entries(s.rules||{}).flatMap(async([a,c])=>{const l=y.rules[a];if(l&&!s.path.includes(".$.")){const i=await l(c,s.input_value,s.path,v);if(i&&!i.valid)for(let f=0;f<i.errors.length;f+=1){const g=i.errors[f];o.push(g)}}}))),o};var E=v;export{E as default,j as handle_get_input_value};
@@ -0,0 +1 @@
1
+ import o from"../databases/queries/sessions.js";const n=async(e=null,r=null)=>{const t=e?.headers["x-joystick-csrf"],s=await o("get_session",{session_id:e?.cookies?.joystick_session});return t==="joystick_test"?!0:!(!s||s&&s.csrf!==t)};var c=n;export{c as default};
@@ -0,0 +1 @@
1
+ import e from"../../lib/types.js";const s=(t,r)=>{switch(t){case"any":return e.is_any(r);case"array":return e.is_array(r);case"boolean":return e.is_boolean(r);case"float":return e.is_float(r);case"integer":return e.is_integer(r);case"number":return e.is_number(r);case"object":return e.is_object(r);case"string":return e.is_string(r)}};var i=s;export{i as default};
@@ -0,0 +1 @@
1
+ var i=null,c=0,l=(t={},e=null)=>{let o=new WebSocket(`ws://localhost:${window.__joystick_hmr_port__}/_joystick/hmr?${new URLSearchParams(t.query).toString()}`);i&&(clearInterval(i),i=null);let _={client:o,send:(n={})=>(t.queryParams&&(n={...n,...t.queryParams}),o.send(JSON.stringify(n)))};return o.addEventListener("open",()=>{console.log("[hmr] Listening for changes..."),c=0,e&&e(_)}),o.addEventListener("message",n=>{n?.data&&t.onMessage&&t.onMessage(JSON.parse(n.data),_)}),o.addEventListener("close",()=>{console.log("[hmr] Disconnected from server."),o=null,t.autoReconnect&&!i&&(i=setInterval(()=>{o=null,c<12?(l(t,e),console.log(`[hmr] Attempting to reconnect (${c+1}/12)...`),c+=1):(console.log("[hmr] Reconnection attempts exhausted. Server is unavailable."),clearInterval(i))},5e3))}),_},u=async()=>{let t=await d();window.joystick.mount(t,Object.assign({},window.__joystick_ssr_props__),document.getElementById("app"))},d=async()=>(await import(`${window.__joystick_page_url__}?v=${new Date().getTime()}`).catch(e=>{location.reload()}))?.default,p=async()=>(await import(`${window.__joystick_layout_url__}?v=${new Date().getTime()}`).catch(e=>{location.reload()}))?.default,y=async()=>{let t=await p(),e=await d();window.joystick.mount(t,Object.assign({page:e},window.__joystick_ssr_props__),document.getElementById("app"))},w=t=>{let e=document.createElement("link");e.setAttribute("rel","stylesheet"),e.setAttribute("href","/_joystick/index.css"),document.head.replaceChild(e,t)},g=(t={})=>{let e=document.createElement("script");e.setAttribute("type","text/javascript"),e.setAttribute("src","/_joystick/index.client.js"),t.parentNode.replaceChild(e,t)},m=l({autoReconnect:!0,query:{user_language:window?.__joystick_user__?.language||"",browser_language:navigator?.language||"",page_component_path:window.__joystick_page_url__?.replace("/_joystick/","")},onMessage:async(t={},e={})=>{if(t&&t.type&&t.type==="BUILD_ERROR")return location.reload();window.__joystick_hmr_update__=!0,window.__joystick_hmr_previous_tree__=[...window.joystick._internal.tree||[]],window.__joystick_hmr_previous_websockets__=[...window.joystick._internal.websockets||[]];let _=Object.assign({},{scrollTop:window.scrollY}),n=t&&t.type&&t.type==="FILE_CHANGE",r=!!window.__joystick_layout_url__&&!!window.__joystick_page_url__,s=document.head.querySelector('link[href="/_joystick/index.css"]'),a=document.body.querySelector('script[src="/_joystick/index.client.js"]');t?.index_html_changed&&location.reload(),t?.i18n&&(window.__joystick_i18n__=t?.i18n),t?.settings&&(window.__joystick_settings__=t?.settings,window.joystick.settings=t?.settings),a&&t?.index_client_changed&&g(a),s&&t?.index_css_changed&&w(s),n&&r&&y(e),n&&!r&&u(e),window.scrollTo(0,_.scrollTop),e.send&&e.send({type:"HMR_UPDATE_COMPLETE"})}}),j=m;export{j as default};
@@ -0,0 +1 @@
1
+ var b=Object.create;var p=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var O=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var q=(e,t,n,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of N(t))!C.call(e,l)&&l!==n&&p(e,l,{get:()=>t[l],enumerable:!(d=L(t,l))||d.enumerable});return e};var A=(e,t,n)=>(n=e!=null?b(x(e)):{},q(t||!e||!e.__esModule?p(n,"default",{value:e,enumerable:!0}):n,e));var y=O((V,g)=>{var r=g.exports={},i,o;function h(){throw new Error("setTimeout has not been defined")}function m(){throw new Error("clearTimeout has not been defined")}(function(){try{typeof setTimeout=="function"?i=setTimeout:i=h}catch{i=h}try{typeof clearTimeout=="function"?o=clearTimeout:o=m}catch{o=m}})();function T(e){if(i===setTimeout)return setTimeout(e,0);if((i===h||!i)&&setTimeout)return i=setTimeout,setTimeout(e,0);try{return i(e,0)}catch{try{return i.call(null,e,0)}catch{return i.call(this,e,0)}}}function D(e){if(o===clearTimeout)return clearTimeout(e);if((o===m||!o)&&clearTimeout)return o=clearTimeout,clearTimeout(e);try{return o(e)}catch{try{return o.call(null,e)}catch{return o.call(this,e)}}}var u=[],a=!1,s,f=-1;function I(){!a||!s||(a=!1,s.length?u=s.concat(u):f=-1,u.length&&w())}function w(){if(!a){var e=T(I);a=!0;for(var t=u.length;t;){for(s=u,u=[];++f<t;)s&&s[f].run();f=-1,t=u.length}s=null,a=!1,D(e)}}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new v(e,t)),u.length===1&&!a&&T(w)};function v(e,t){this.fun=e,this.array=t}v.prototype.run=function(){this.fun.apply(null,this.array)};r.title="browser";r.browser=!0;r.env={};r.argv=[];r.version="";r.versions={};function c(){}r.on=c;r.addListener=c;r.once=c;r.off=c;r.removeListener=c;r.removeAllListeners=c;r.emit=c;r.prependListener=c;r.prependOnceListener=c;r.listeners=function(e){return[]};r.binding=function(e){throw new Error("process.binding is not supported")};r.cwd=function(){return"/"};r.chdir=function(e){throw new Error("process.chdir is not supported")};r.umask=function(){return 0}});var E=A(y(),1);window.process=E.default;var Q={NODE_ENV:"${NODE_ENV}"};window.process&&(window.process.env=Q);
@@ -0,0 +1 @@
1
+ import s from"node-cron";import e from"../../lib/types.js";const _=(n={})=>{if(e.is_object(n)){const i=Object.entries(n||{});for(let t=0;t<i.length;t+=1){const[r,o]=i[t];o?.schedule&&o?.run&&e.is_function(o?.run)&&(process.cron={...process.queues||{},[r]:s.schedule(o?.schedule,()=>{(o?.logAtRunTime&&e.is_string(o?.logAtRunTime)||o?.log_at_run_time&&e.is_string(o?.log_at_run_time))&&console.log(o.logAtRunTime||o?.log_at_run_time),o.run()})})}}};var l=_;export{l as default};
@@ -0,0 +1 @@
1
+ const o={mongodb:"nosql",postgresql:"sql"};var s=o;export{s as default};
@@ -0,0 +1 @@
1
+ import i from"../settings/load.js";const d=(r="users")=>{const t=i()?.config?.databases||[],a=t.findIndex(s=>!!s[r]),e=t[a];if(!e)return null;const n=t?.filter(s=>s?.provider===e?.provider)?.length>1,o=parseInt(process.env.PORT,10)+10+a;return{database_type:r,provider:e?.provider,connection:n?process.databases[e?.provider][e?.name||`${e?.provider}_${o}`]:process.databases[e?.provider]}};var _=d;export{_ as default};
@@ -0,0 +1 @@
1
+ const e=["replicaSet","tls","ssl","tlsCertificateKeyFile","tlsCertificateKeyFilePassword","tlsCAFile","tlsAllowInvalidCertificates","tlsAllowInvalidHostnames","tlsInsecure","connectTimeoutMS","socketTimeoutMS","compressors","zlibCompressionLevel","maxPoolSize","minPoolSize","maxIdleTimeMS","waitQueueMultiple","waitQueueTimeoutMS","w","wtimeoutMS","journal","readConcernLevel","readPreference","maxStalenessSeconds","readPreferenceTags","authSource","authMechanism","authMechanismProperties","gssapiServiceName","localThresholdMS","serverSelectionTimeoutMS","serverSelectionTryOnce","heartbeatFrequencyMS","appName","retryReads","retryWrites","uuidRepresentation"];var t=e;export{t as default};
@@ -0,0 +1 @@
1
+ import m from"./build_query_parameters.js";import $ from"../../../lib/serialize_query_parameters.js";const p=(r={})=>{let s="mongodb://";r&&(r.username||r.password)&&(s=`${s}${r.username||r.password?`${r.username||""}${r.username&&r.password?":":""}${r.password||""}@`:""}`),r&&r.hosts&&Array.isArray(r.hosts)&&(s=`${s}${r.hosts.map(e=>`${e.hostname}:${e.port}`).join(",")}`),r&&r.database&&(s=`${s}/${r.database}`);const a=m(r);return Object.keys(a||{})?.length>0&&(s=`${s}?${$(a)}`),s};var _=p;export{_ as default};
@@ -0,0 +1 @@
1
+ import l from"./available_query_parameters.js";const m=(r={})=>{const t={};for(let e=0;e<l.length;e+=1){const a=l[e];r&&r[a]&&(t[a]=r[a])}return t};var s=m;export{s as default};
@@ -0,0 +1,6 @@
1
+ import r from"chalk";import l from"fs";import{MongoClient as p}from"mongodb";import m from"mongo-uri-tool";import a from"./build_connection_string.js";const d=async(o={},c=2610)=>{try{const n=o?.connection||{hosts:[{hostname:"127.0.0.1",port:c}],database:"app",replicaSet:`joystick_${c}`},t=a(n),i=m.parseUri(t),e={ssl:!["development","test"].includes(process.env.NODE_ENV),...o?.options||{}};o?.options?.ca&&(e.ca=l.readFileSync(o?.options?.ca));const s=(await p.connect(t,e)).db(i.db);return Promise.resolve(s)}catch(n){console.warn(r.yellowBright(`
2
+ Failed to connect to MongoDB. Please double-check connection settings and try again.
3
+
4
+ Error from MongoDB:
5
+
6
+ ${r.redBright(n?.message)}`))}};var B=d;export{B as default};
@@ -0,0 +1 @@
1
+ import o from"../../../lib/types.js";const t={sessions:async()=>{await process.databases._sessions?.collection("sessions").createIndex("sessions",{_id:1}),await process.databases._sessions?.collection("sessions").createIndex("sessions",{createdAt:1},{expireAfterSeconds:3600})},users:async()=>{await process.databases._users?.collection("users").createIndex({_id:1}),await process.databases._users?.collection("users").createIndex({emailAddress:1}),await process.databases._users?.collection("users").createIndex({username:1}),await process.databases._users?.collection("users").createIndex({"sessions.token":1}),await process.databases._users?.collection("users").createIndex({"passwordResetTokens.token":1}),await process.databases._users?.collection("users").createIndex({"passwordResetTokens.token":1,_id:1}),await process.databases._users?.collection("users").createIndex({roles:1}),await process.databases._users?.collection("users").createIndex({roles:1,_id:1}),await process.databases._users?.collection("roles").createIndex({role:1}),await process.databases._users?.collection("roles").createIndex({role:1,userId:1})}},r=async(e=[])=>{for(let s=0;s<e?.length;s+=1){const a=e[s];o.is_function(t[a])&&await t[a]()}};var n=r;export{n as default};
@@ -0,0 +1 @@
1
+ import o from"pg-escape";const c=async(t="",a={})=>{if(t==="postgresql"){const s=Object.keys(a||{});for(let e=0;e<s?.length;e+=1)await process.databases.postgresql.query(o("ALTER TABLE users ADD COLUMN IF NOT EXISTS %I TEXT;",s[e]))}};var l=c;export{l as default};
@@ -0,0 +1,30 @@
1
+ import n from"chalk";import i from"fs";import g from"os";import d from"pg";import l from"../sql.js";const{Pool:m}=d,p=async(c={},h=2610)=>{const s=c?.connection||{hosts:[{hostname:"127.0.0.1",port:h}],database:"app",username:(g.userInfo()||{}).username||"",password:""};try{const a=s.hosts&&s.hosts[0],u={user:s?.username||"",database:s?.database,password:s?.password||"",host:a?.hostname,port:a?.port,...c?.options||{}};c?.options?.ssl?.ca&&(u.ssl={ca:i.readFileSync(c?.options?.ssl?.ca)});const r=new m(u);return{pool:r,query:(...t)=>r.query(...t).then(e=>e?.rows||[]).catch(e=>{throw console.log(n.redBright(`
2
+ Failed SQL Statement:
3
+ `)),console.log(t[0]),console.log(`
4
+ `),console.log(n.redBright(`
5
+ Failed Values:
6
+ `)),console.log(t[1]),e}),add_column:(t={})=>{const e=l.add_column(t);return r.query(e.statement).then(o=>o?.rows||[]).catch(o=>{throw console.log(n.redBright(`
7
+ Failed SQL Statement:
8
+ `)),console.log(e.statement),o})},create_table:(t={})=>{const e=l.create_table(t);return r.query(e.statement).then(o=>o?.rows||[]).catch(o=>{throw console.log(n.redBright(`
9
+ Failed SQL Statement:
10
+ `)),console.log(e.statement),o})},insert:(t={})=>{const e=l.insert(t);return r.query(e.statement,e.values).then(o=>o?.rows||[]).catch(o=>{throw console.log(n.redBright(`
11
+ Failed SQL Statement:
12
+ `)),console.log(e.statement),console.log(`
13
+ `),console.log(n.redBright(`
14
+ Failed Values:
15
+ `)),console.log(e.values),o})},select:(t={})=>{const e=l.select(t);return r.query(e.statement,e.values).then(o=>o?.rows||[]).catch(o=>{throw console.log(n.redBright(`
16
+ Failed SQL Statement:
17
+ `)),console.log(e.statement),console.log(`
18
+ `),console.log(n.redBright(`
19
+ Failed Values:
20
+ `)),console.log(e.where),o})},update:(t={})=>{const e=l.update(t);return r.query(e.statement,e.values).then(o=>o?.rows||[]).catch(o=>{throw console.log(n.redBright(`
21
+ Failed SQL Statement:
22
+ `)),console.log(e.statement),console.log(`
23
+ `),console.log(n.redBright(`
24
+ Failed Values:
25
+ `)),console.log(e.values),o})}}}catch(a){console.warn(n.yellowBright(`
26
+ Failed to connect to PostgreSQL. Please double-check connection settings and try again.
27
+
28
+ Error from PostgreSQL:
29
+
30
+ ${n.redBright(a?.message)}`))}};var f=p;export{f as default};
@@ -0,0 +1 @@
1
+ import t from"node-cron";import i from"../../../lib/types.js";import n from"./handle_cleanup_sessions.js";const u=async(r="",e="",_="",a=[])=>process.databases[r]?.query(`CREATE UNIQUE INDEX IF NOT EXISTS ${e} ON ${_}(${a.join(", ")})`),s=async(r="",e="",_="",a=[])=>process.databases[r]?.query(`CREATE INDEX IF NOT EXISTS ${e} ON ${_}(${a.join(", ")})`),o={sessions:async()=>{await s("_sessions","session_by_id","sessions",["session_id"]),await s("_sessions","session_created_at","sessions",["created_at"]),t.schedule("*/30 * * * * *",()=>{n()})},users:async()=>{await s("_users","user_by_email","users",["email_address"]),await s("_users","user_by_username","users",["username"]),await s("_users","user_by_user_id","users",["user_id"]),await s("user_session_by_token","users_sessions",["token"]),await s("_users","user_password_reset_token_by_token","users_password_reset_tokens",["token"]),await s("_users","user_password_reset_token_by_user_id_token","users_password_reset_tokens",["user_id","token"]),await s("_users","user_role","users_roles",["role"]),await s("_users","user_roles_by_user_id_role","users_roles",["user_id","role"]),await s("_users","role","roles",["role"]),await u("_users","user_roles","users_roles",["user_id","role"])}},d=async(r=[])=>{for(let e=0;e<r?.length;e+=1){const _=r[e];i.is_function(o[_])&&await o[_]()}};var y=d;export{y as default};
@@ -0,0 +1 @@
1
+ import a from"../../../lib/types.js";const e=(t="",s="",r=[])=>process.databases[t]?.query(`CREATE TABLE IF NOT EXISTS ${s} (${r.join(", ")})`),i={sessions:async()=>{await e("_sessions","sessions",["id bigserial primary key","session_id text","csrf text","created_at text"])},users:async()=>{await e("_users","users",["id bigserial primary key","user_id text","email_address text","password text","username text","language text"]),await e("_users","users_sessions",["id bigserial primary key","user_id text","token text","token_expires_at text"]),await e("_users","users_password_reset_tokens",["id bigserial primary key","user_id text","token text","requested_at text"]),await e("_users","users_verify_email_tokens",["id bigserial primary key","user_id text","token text"]),await e("_users","roles",["id bigserial primary key","role text"]),await e("_users","users_roles",["id bigserial primary key","user_id text","role text"])}},o=async(t=[])=>{for(let s=0;s<t?.length;s+=1){const r=t[s];a.is_function(i[r])&&await i[r]()}};var n=o;export{n as default};
@@ -0,0 +1,5 @@
1
+ import e from"../../../lib/timestamps.js";const n=async({database:s={},table:_="",seconds:a=0})=>{const i=(await s.query(`
2
+ SELECT * FROM ${_} WHERE status = ANY($1) AND environment = $2
3
+ `,[["completed","failed"],process.env.NODE_ENV]))?.filter((t={})=>t?.status==="completed"?e.get_future_time("seconds",a,{start_from:t?.completed_at})<=e.get_current_time():t?.status==="failed"?e.get_future_time("seconds",a,{start_from:t?.failed_at})<=e.get_current_time():!1);await s.query(`
4
+ DELETE FROM ${_} WHERE _id = ANY($1)
5
+ `,[i?.map(({_id:t})=>t)])};var u=n;export{u as default};
@@ -0,0 +1 @@
1
+ const s=async()=>{await process.databases._sessions.query("DELETE FROM sessions where created_at::timestamp <= timezone('utc', now() - interval '1 hour')")};var e=s;export{e as default};
@@ -0,0 +1 @@
1
+ import c from"../get_target_database_connection.js";import r from"./map.js";const u=async(t="",n={})=>{const o=c("users"),e=o&&r&&r[o?.provider]&&r[o?.provider]?.accounts,s=e&&e[t];if(o?.connection&&s){const a=await e[t](n,o?.connection);return Promise.resolve(a)}return null};var _=u;export{_ as default};
@@ -0,0 +1 @@
1
+ import s from"./mongodb/accounts.js";import o from"./mongodb/queues.js";import e from"./mongodb/sessions.js";import r from"./postgresql/accounts.js";import u from"./postgresql/queues.js";import m from"./postgresql/sessions.js";const t={mongodb:{accounts:s,queues:o,sessions:e},postgresql:{accounts:r,queues:u,sessions:m}};var g=t;export{g as default};
@@ -0,0 +1 @@
1
+ import a from"../../../../lib/generate_id.js";const n={add_password_reset_token:(e={})=>process.databases._users?.collection("users").updateOne({emailAddress:e.email_address},{$addToSet:{passwordResetTokens:{token:e.token,requestedAt:new Date().toISOString()}}}),add_role:async(e={})=>!(e?.role?await process.databases._users?.collection("roles").findOne({role:e?.role}):null)&&e?.role?(await process.databases._users?.collection("roles").insertOne({_id:a(16),role:e?.role}),{_id:e?.user_id,action:"add",role:e?.role,ok:!0,error:null}):{action:"add",role:e?.role,ok:!1,error:e?.role?`Role already exists: ${e?.role}.`:"Must pass a name for role to add."},add_session:async(e={})=>{await process.databases._users?.collection("users").updateOne({_id:e.user_id},{$addToSet:{sessions:e.session}})},create_email_verification_token:async(e={})=>{const s=a(16);return await process.databases._users?.collection("users").updateOne({_id:e?.user_id},{$addToSet:{verifyEmailTokens:{userId:e?.user_id,token:s}}}),s},create_user:async(e={})=>{const s=a(16);return await process.databases._users?.collection("users").insertOne({_id:s,...e,sessions:[]}),s},delete_old_sessions:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});if(s){const r=s?.sessions?.filter(o=>new Date(o?.tokenExpiresAt||o?.token_expires_at).toISOString()>new Date().toISOString());await process.databases._users?.collection("users").updateOne({_id:e.user_id},{$set:{sessions:r}})}},delete_user:async(e={})=>process.databases._users?.collection("users").deleteOne({_id:e?.user_id}),existing_user:async(e={})=>{let s,r;return e?.email_address&&(s=await process.databases._users?.collection("users").findOne({emailAddress:e.email_address})),e?.username&&(r=await process.databases._users?.collection("users").findOne({username:e.username})),s||r?{existing_email_address:s?.emailAddress,existing_username:r?.username}:null},get_existing_session:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});return s?.sessions?.length>0?(s?.sessions.sort((o,t)=>(o.tokenExpiresAt||o.token_expires_at)>(t.tokenExpiresAt||t.token_expires_at)?-1:1)).shift():null},get_password_reset_token:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});return s&&s?.passwordResetTokens&&s?.passwordResetTokens[0]?.token||null},grant_role:async(e={})=>await process.databases._users?.collection("users").findOne({_id:e?.user_id})?(await process.databases._users?.collection("users").updateOne({_id:e?.user_id},{$addToSet:{roles:e?.role}}),await process.databases._users?.collection("roles").findOne({role:e?.role})||await process.databases._users?.collection("roles").insertOne({_id:a(16),role:e?.role}),{_id:e?.user_id,action:"grant",role:e?.role,ok:!0,error:null}):{_id:e?.user_id,action:"grant",role:e?.role,ok:!1,error:`User not found with the _id ${e?.user_id}.`},list_roles:async()=>(await process.databases._users?.collection("roles").find().toArray()||[]).map(({role:s})=>s),mark_email_verified_at:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});return await process.databases._users?.collection("users").updateOne({_id:e?.user_id},{$set:{emailVerified:!0,emailVerifiedAt:new Date().toISOString(),verifyEmailTokens:s?.verifyEmailTokens?.filter(r=>r?.token===e?.token)}}),!0},remove_reset_token:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});return await process.databases._users?.collection("users").updateOne({_id:e?.user_id},{$set:{passwordResetTokens:s?.passwordResetTokens?.filter(({token:r})=>r!==e?.token)}}),process.databases._users?.collection("users").findOne({_id:e?.user_id})},remove_role:async(e={})=>(e?.role?await process.databases._users?.collection("roles").findOne({role:e?.role}):null)?(await process.databases._users?.collection("users").updateMany({roles:{$in:[e?.role]}},{$pull:{roles:e?.role}}),await process.databases._users?.collection("roles").deleteOne({role:e?.role}),{_id:e?.user_id,action:"remove",role:e?.role,ok:!0,error:null}):{action:"add",role:e?.role,ok:!1,error:`Could not find an existing role with the name ${e?.role}.`},reset_user_sessions:async(e={})=>{await process.databases._users?.collection("users").findOne({_id:e?.user_id})&&await process.databases._users?.collection("users").updateOne({_id:e.user_id},{$set:{sessions:[]}})},revoke_role:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});return s&&s.roles?(await process.databases._users?.collection("users").updateOne({_id:e?.user_id},{$pull:{roles:e?.role}}),{_id:e?.user_id,action:"revoke",role:e?.role,ok:!0,error:null}):{_id:e?.user_id,action:"revoke",role:e?.role,ok:!1,error:`User not found with the _id ${e?.user_id}.`}},set_new_password:async(e={})=>process.databases._users?.collection("users").updateOne({_id:e?.user_id},{$set:{password:e?.hashed_password}}),user:async(e={})=>e?.email_address?await process.databases._users?.collection("users").findOne({emailAddress:e.email_address}):e?.username?await process.databases._users?.collection("users").findOne({username:e.username}):e?._id?await process.databases._users?.collection("users").findOne({_id:e._id}):null,user_has_role:async(e={})=>{const s=await process.databases._users?.collection("users").findOne({_id:e?.user_id});return s&&s.roles?s?.roles?.includes(e?.role):!1},user_with_login_token:async(e={})=>await process.databases._users?.collection("users").findOne({"sessions.token":e?.token}),user_with_reset_token:async(e={})=>await process.databases._users?.collection("users").findOne({"passwordResetTokens.token":e["passwordResetTokens.token"]}),user_with_verify_email_token:async(e={})=>await process.databases._users?.collection("users").findOne({"verifyEmailTokens.token":e?.token})};var l=n;export{l as default};
@@ -0,0 +1 @@
1
+ import u from"cluster";import i from"../../../../lib/timestamps.js";const o={add_job:function(e={}){return(this.db?.collection(`queue_${this.queue.name}`)).insertOne({...e,attempts:0})},count_jobs:function(e=""){return(this.db?.collection(`queue_${this.queue.name}`)).countDocuments({status:e,locked_by:this.machine_id})},delete_job:function(e=""){return(this.db?.collection(`queue_${this.queue.name}`)).deleteOne({_id:e})},delete_incomplete_jobs_for_machine:function(){return(this.db?.collection(`queue_${this.queue.name}`)).deleteMany({status:{$in:["incomplete","running"]},locked_by:this.machine_id})},get_jobs:function(e={}){return(this.db?.collection(`queue_${this.queue.name}`)).find({...e,environment:process.env.NODE_ENV}).toArray()},get_next_job_to_run:async function(){return await(this.db?.collection(`queue_${this.queue.name}`)).findOneAndUpdate({$or:[{status:"pending",environment:process.env.NODE_ENV,next_run_at:{$lte:i.get_current_time()},locked_by:{$exists:!1}},{status:"pending",environment:process.env.NODE_ENV,next_run_at:{$lte:i.get_current_time()},locked_by:null}]},{$set:{status:"running",started_at:i.get_current_time(),locked_by:this.machine_id}},{sort:{next_run_at:1}})},initialize_database:async function(){if(u.isPrimary||u.isWorker&&u.worker.id===1){try{await this.db.createCollection(`queue_${this.queue.name}`)}catch{}const e=this.db?.collection(`queue_${this.queue.name}`),t=await e?.indexes();await e.createIndex({status:1}),await e.createIndex({status:1,next_run_at:1}),await e.createIndex({status:1,environment:1,next_run_at:1,locked_by:1}),(this.queue.options?.cleanup?.completedAfterSeconds||this.queue.options?.cleanup?.completed_after_seconds)&&(t?.find(n=>n?.name==="completed_at_1")&&await e.dropIndex({completed_at:1}),await e.createIndex({completed_at:1},{expireAfterSeconds:this?.queue?.options?.cleanup?.completedAfterSeconds||this.queue.options?.cleanup?.completed_after_seconds})),(this.queue.options?.cleanup?.failedAfterSeconds||this.queue.options?.cleanup?.failed_after_seconds)&&(t?.find(n=>n?.name==="failed_at_1")&&await e.dropIndex({failed_at:1}),await e.createIndex({failed_at:1},{expireAfterSeconds:this?.queue?.options?.cleanup?.failedAfterSeconds||this.queue.options?.cleanup?.failed_after_seconds}))}},log_attempt:function(e=""){return(this.db?.collection(`queue_${this.queue.name}`)).updateOne({_id:e},{$inc:{attempts:1}})},requeue_job:function(e="",t=null){return(this.db?.collection(`queue_${this.queue.name}`)).updateOne({_id:e},{$set:{status:"pending",next_run_at:t},$unset:{locked_by:""}})},set_job_completed:function(e=""){return(this.db?.collection(`queue_${this.queue.name}`)).updateOne({_id:e},{$set:{status:"completed",completed_at:i.get_current_time({mongodb_ttl:!0})}})},set_job_failed:function(e="",t=""){return(this.db?.collection(`queue_${this.queue.name}`)).updateOne({_id:e},{$set:{status:"failed",failed_at:i.get_current_time({mongodb_ttl:!0}),error:t}})},set_jobs_for_machine_pending:function(){return(this.db?.collection(`queue_${this.queue.name}`)).updateMany({status:{$in:["pending","running"]},locked_by:this.machine_id},{$set:{status:"pending"},$unset:{locked_by:""}})}};var a=o;export{a as default};
@@ -0,0 +1 @@
1
+ import e from"../../../../lib/generate_id.js";const n={create_session:async()=>{const s=e(16);return await process.databases._sessions?.collection("sessions").insertOne({_id:s,csrf:e(32),created_at:new Date(new Date().toISOString())}),s},get_session:async(s={})=>process.databases._sessions?.collection("sessions").findOne({_id:s?.session_id})};var i=n;export{i as default};
@@ -0,0 +1 @@
1
+ import _ from"../../../../lib/generate_id.js";import u from"../../../../lib/camel_pascal_to_snake.js";const i={add_password_reset_token:async(s={})=>{const[e]=await process.databases._users?.query("SELECT user_id FROM users WHERE email_address = $1;",[s?.email_address]);await process.databases._users?.query("INSERT INTO users_password_reset_tokens(user_id, token, requested_at) VALUES ($1, $2, $3);",[e?.user_id,s?.token,new Date().toISOString()])},add_role:async(s={})=>{const[e]=await process.databases._users?.query("SELECT * FROM roles WHERE role = $1;",[s?.role]);return!e&&s?.role?(await process.databases._users?.query("INSERT INTO roles(role) VALUES ($1);",[s?.role]),{_id:s?.user_id,action:"add",role:s?.role,ok:!0,error:null}):{action:"add",role:s?.role,ok:!1,error:s?.role?`Role already exists: ${s?.role}.`:"Must pass a name for role to add."}},add_session:async(s={})=>{await process.databases._users?.query("INSERT INTO users_sessions(user_id, token, token_expires_at) VALUES ($1, $2, $3);",[s?.user_id,s?.session?.token,s?.session?.token_expires_at])},create_email_verification_token:async(s={})=>{const e=_(16);return await process.databases._users?.query("INSERT INTO users_verify_email_tokens(user_id, token) VALUES ($1, $2);",[s?.user_id,e]),e},create_user:async(s={})=>{const e=_(16),r=["user_id",...Object.keys(s||{})||[]].map(o=>u(o))?.join(","),a=[e,...Object.values(s)||[]];return await process.databases._users?.query(`INSERT INTO users(${r}) VALUES (${a?.map((o,t)=>`$${t+1}`)});`,a),e},delete_old_sessions:async(s={})=>{await process.databases._users?.query("DELETE FROM users_sessions WHERE user_id = $1 AND token_expires_at::timestamp < NOW()",[s?.user_id])},delete_user:async(s={})=>{await process.databases._users?.query("DELETE FROM users WHERE user_id = $1",[s?.user_id])},existing_user:async(s={})=>{let e,r;if(s?.email_address){const[a]=await process.databases._users?.query("SELECT * FROM users WHERE email_address = $1;",[s?.email_address]);e=a}if(s?.username){const[a]=await process.databases._users?.query("SELECT * FROM users WHERE username = $1;",[s?.username]);r=a}return e||r?{existing_email_address:e?.email_address,existing_username:r?.username}:null},get_existing_session:async(s={})=>{const e=await process.databases._users?.query("SELECT * FROM users_sessions WHERE user_id = $1;",[s.user_id]);return e?.length>0?e.sort((a,o)=>a.token_expires_at>o.token_expires_at?-1:1).shift():null},get_password_reset_token:async(s={})=>{const[e]=await process.databases._users?.query("SELECT * FROM users_password_reset_tokens WHERE user_id = $1",[s?.user_id]);return e&&e?.token||null},grant_role:async(s={})=>{if(await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[s?.user_id])){await process.databases._users?.query("INSERT INTO users_roles(user_id, role) VALUES ($1, $2) ON CONFLICT DO NOTHING;",[s?.user_id,s?.role]);const[r]=await process.databases._users?.query("SELECT * FROM roles WHERE role = $1;",[s?.role]);return r||await process.databases._users?.query("INSERT INTO roles(role) VALUES ($1) ON CONFLICT DO NOTHING;",[s?.role]),{_id:s?.user_id,action:"grant",role:s?.role,ok:!0,error:null}}return{_id:s?.user_id,action:"grant",role:s?.role,ok:!1,error:`User not found with the _id ${s?.user_id}.`}},list_roles:async()=>(await process.databases._users?.query("SELECT * FROM roles;")||[]).map(({role:e})=>e),mark_email_verified_at:async(s={})=>{await process.databases._users?.query("UPDATE users SET email_verified = true, email_verified_at = $1 WHERE user_id = $2;",[new Date().toISOString(),s?.user_id]),await process.databases._users?.query("DELETE FROM users_verify_email_tokens WHERE token = $1",[s?.token])},remove_reset_token:async(s={})=>{await process.databases._users?.query("DELETE FROM users_password_reset_tokens WHERE user_id = $1 AND token = $2;",[s?.user_id,s?.token]);const[e]=await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[s?.user_id]);return e},remove_role:async(s={})=>{const[e]=await process.databases._users?.query("SELECT * FROM roles WHERE role = $1;",[s?.role]);return e?(await process.databases._users?.query("DELETE FROM users_roles WHERE role = $1;",[s?.role]),await process.databases._users?.query("DELETE FROM roles WHERE role = $1;",[s?.role]),{_id:s?.user_id,action:"remove",role:s?.role,ok:!0,error:null}):{action:"add",role:s?.role,ok:!1,error:`Could not find an existing role with the name ${s?.role}.`}},reset_user_sessions:async(s={})=>{await process.databases._users?.query("DELETE FROM users_sessions WHERE user_id = $1;",[s.user_id])},revoke_role:async(s={})=>await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[s?.user_id])?(await process.databases._users?.query("DELETE FROM users_roles WHERE user_id = $1 AND role = $2;",[s?.user_id,s?.role]),{_id:s?.user_id,action:"revoke",role:s?.role,ok:!0,error:null}):{_id:s?.user_id,action:"revoke",role:s?.role,ok:!1,error:`User not found with the _id ${s?.user_id}.`},set_new_password:async(s={})=>{await process.databases._users?.query("UPDATE users SET password = $1 WHERE user_id = $2;",[s?.hashed_password,s?.user_id])},user:async(s={})=>{if(s?.email_address){const[e]=await process.databases._users?.query("SELECT * FROM users WHERE email_address = $1;",[s?.email_address]);return e}if(s?.username){const[e]=await process.databases._users?.query("SELECT * FROM users WHERE username = $1;",[s?.username]);return e}if(s?._id){const[e]=await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[s?._id]);return e}return null},user_has_role:async(s={})=>{if(await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[s?.user_id])){const[r]=await process.databases._users?.query("SELECT * FROM users_roles WHERE user_id = $1 AND role = $2;",[s?.user_id,s?.role]);return!!r}return!1},user_with_login_token:async(s={})=>{const[e]=await process.databases._users?.query("SELECT user_id FROM users_sessions WHERE token = $1;",[s.token]),[r]=await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[e?.user_id]);return r},user_with_reset_token:async(s={})=>{const[e]=await process.databases._users?.query("SELECT user_id FROM users_password_reset_tokens WHERE token = $1;",[s["passwordResetTokens.token"]]),[r]=await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[e?.user_id]);return r},user_with_verify_email_token:async(s={})=>{const[e]=await process.databases._users?.query("SELECT user_id FROM users_verify_email_tokens WHERE token = $1;",[s.token]),[r]=await process.databases._users?.query("SELECT * FROM users WHERE user_id = $1;",[e?.user_id]);return r}};var n=i;export{n as default};
@@ -0,0 +1,123 @@
1
+ import s from"node-cron";import i from"../../postgresql/handle_cleanup_queues.js";import n from"../../../../lib/timestamps.js";import a from"../../../../lib/wait.js";const o={add_job:async function(e={}){const t=this?.db,[u]=await t?.query("SELECT * FROM information_schema.tables WHERE table_name = $1",[`queue_${this.queue.name}`]);return u||await a(1),t?.query(`
2
+ INSERT INTO queue_${this.queue.name} (
3
+ _id,
4
+ status,
5
+ environment,
6
+ job,
7
+ payload,
8
+ next_run_at,
9
+ attempts
10
+ ) VALUES (
11
+ $1, $2, $3, $4, $5, $6, $7
12
+ )
13
+ `,[e?._id,e?.status,e?.environment,e?.job,JSON.stringify(e?.payload),e?.nextRunAt||e?.next_run_at,0])},count_jobs:async function(e=""){const t=this?.db,[u]=await t?.query(`
14
+ SELECT
15
+ count(*)
16
+ FROM
17
+ queue_${this.queue.name}
18
+ WHERE
19
+ status = $1
20
+ AND
21
+ locked_by = $2
22
+ `,[e,this.machine_id]);return Promise.resolve(u.count)},delete_job:function(e=""){return this?.db?.query(`
23
+ DELETE FROM
24
+ queue_${this.queue.name}
25
+ WHERE
26
+ _id = $1
27
+ `,[e])},delete_incomplete_jobs_for_machine:function(){return this?.db?.query(`
28
+ DELETE FROM
29
+ queue_${this.queue.name}
30
+ WHERE
31
+ status = ANY($1)
32
+ AND
33
+ locked_by = $2
34
+ `,[["incomplete","running"],this.machine_id])},get_jobs:function(e={}){return this?.db?.query(`
35
+ SELECT * FROM
36
+ queue_${this.queue.name}
37
+ ${e?.status?`
38
+ WHERE
39
+ status = $1
40
+ AND
41
+ environment = $2
42
+ `:""}
43
+ `,[e?.status,process.env.NODE_ENV])},get_next_job_to_run:async function(){const e=this?.db,[t]=await e?.query(`
44
+ SELECT * FROM
45
+ queue_${this.queue.name}
46
+ WHERE
47
+ status = $1
48
+ AND
49
+ environment = $2
50
+ AND
51
+ next_run_at::timestamp <= $3
52
+ AND
53
+ locked_by IS NULL
54
+ ORDER BY
55
+ next_run_at ASC
56
+ `,["pending",process.env.NODE_ENV,n.get_current_time()]);return t?._id&&await e?.query(`
57
+ UPDATE
58
+ queue_${this.queue.name}
59
+ SET
60
+ status = $1,
61
+ started_at = $2,
62
+ locked_by = $3
63
+ WHERE
64
+ _id = $4
65
+ `,["running",n.get_current_time(),this.machine_id,t?._id]),t?{...t,payload:t?.payload?JSON.parse(t?.payload||""):{}}:{}},initialize_database:async function(){if(cluster.isPrimary||cluster.isWorker&&cluster.worker.id===1){const e=this?.db;await e?.query(`
66
+ CREATE TABLE IF NOT EXISTS queue_${this.queue.name} (
67
+ _id text PRIMARY KEY,
68
+ status text,
69
+ job text,
70
+ payload text,
71
+ next_run_at text,
72
+ locked_by text,
73
+ started_at text,
74
+ completed_at text,
75
+ failed_at text,
76
+ error text,
77
+ environment text,
78
+ attempts smallint
79
+ )
80
+ `),await e?.query(`ALTER TABLE queue_${this.queue.name} ADD COLUMN IF NOT EXISTS environment text`),await e?.query(`ALTER TABLE queue_${this.queue.name} ADD COLUMN IF NOT EXISTS attempts smallint`),await e?.query(`CREATE INDEX IF NOT EXISTS status_index ON queue_${this.queue.name} (status)`),await e?.query(`CREATE INDEX IF NOT EXISTS status_next_run_at_index ON queue_${this.queue.name} (status, next_run_at)`),await e?.query(`CREATE INDEX IF NOT EXISTS next_job_index ON queue_${this.queue.name} (status, environment, next_run_at, locked_by)`),await e?.query(`CREATE INDEX IF NOT EXISTS completed_at_index ON queue_${this.queue.name} (completed_at)`),await e?.query(`CREATE INDEX IF NOT EXISTS failed_at_index ON queue_${this.queue.name} (failed_at)`),(this.queue.options?.cleanup?.completedAfterSeconds||this.queue.options?.cleanup?.completed_after_seconds)&&s.schedule("*/30 * * * * *",()=>{i({database:e,table:`queue_${this.queue.name}`,seconds:this.queue.options?.cleanup?.completedAfterSeconds||this.queue.options?.cleanup?.completed_after_seconds})}),(this.queue.options?.cleanup?.failedAfterSeconds||this.queue.options?.cleanup?.failed_after_seconds)&&s.schedule("*/30 * * * * *",()=>{i({database:e,table:`queue_${this.queue.name}`,seconds:this.queue.options?.cleanup?.failedAfterSeconds||this.queue.options?.cleanup?.failed_after_seconds})})}},log_attempt:function(e=""){return this?.db?.query(`
81
+ UPDATE
82
+ queue_${this.queue.name}
83
+ SET
84
+ attempts = attempts + 1
85
+ WHERE
86
+ _id = $1
87
+ `,[e])},requeue_job:function(e="",t=null){return this?.db?.query(`
88
+ UPDATE
89
+ queue_${this.queue.name}
90
+ SET
91
+ status = $1,
92
+ next_run_at = $2,
93
+ locked_by = $3
94
+ WHERE
95
+ _id = $4
96
+ `,["pending",t,null,e])},set_job_completed:function(e=""){return this?.db?.query(`
97
+ UPDATE
98
+ queue_${this.queue.name}
99
+ SET
100
+ status = $1,
101
+ completed_at = $2
102
+ WHERE
103
+ _id = $3
104
+ `,["completed",n.get_current_time(),e])},set_job_failed:function(e="",t=""){return this?.db?.query(`
105
+ UPDATE
106
+ queue_${this.queue.name}
107
+ SET
108
+ status = $1,
109
+ failed_at = $2,
110
+ error = $3
111
+ WHERE
112
+ _id = $4
113
+ `,["failed",n.get_current_time(),t,e])},set_jobs_for_machine_pending:function(){return this?.db?.query(`
114
+ UPDATE
115
+ queue_${this.queue.name}
116
+ SET
117
+ status = $1,
118
+ locked_by = $2
119
+ WHERE
120
+ status = ANY($3)
121
+ AND
122
+ locked_by = $4
123
+ `,["pending",null,["pending","running"],this.machine_id])}};var E=o;export{E as default};
@@ -0,0 +1,14 @@
1
+ import n from"../../../../lib/generate_id.js";const i={create_session:async(e={})=>{const s=n();return await process.databases._sessions?.query(`
2
+ INSERT INTO
3
+ sessions (
4
+ session_id,
5
+ csrf,
6
+ created_at
7
+ )
8
+ VALUES ($1, $2, $3)
9
+ `,[s,n(32),new Date().toISOString()]),s},get_session:async(e={})=>{const[s]=await process.databases._sessions?.query(`
10
+ SELECT * FROM
11
+ sessions
12
+ WHERE
13
+ session_id = $1
14
+ `,[e?.session_id]);return s}};var t=i;export{t as default};
@@ -0,0 +1 @@
1
+ import i from"../get_target_database_connection.js";import e from"./map.js";const c=async(n="",r={})=>{const s=i("sessions"),o=s&&e&&e[s?.provider]&&e[s?.provider]?.sessions,t=o&&o[n];if(s?.connection&&t){const a=await o[n](r,s?.connection);return Promise.resolve(a)}return null};var u=c;export{u as default};
@@ -0,0 +1 @@
1
+ import n from"./mongodb/connect.js";import r from"./postgresql/connect.js";const p=async(o={},e=2610,c=!1)=>{if(o?.provider==="mongodb"){const s=await n(o,e);process.databases={...process.databases||{},mongodb:c?{...process?.databases?.mongodb||{},[o?.name||`mongodb_${e}`]:s}:s}}if(o?.provider==="postgresql"){const s=await r(o,e);process.databases={...process.databases||{},postgresql:c?{...process?.databases?.postgresql||{},[o?.name||`postgresql_${e}`]:s}:s}}return Promise.resolve(process.databases)};var g=p;export{g as default};
@@ -0,0 +1 @@
1
+ const l={create_table:(e={})=>{const t=Object.entries(e?.columns)?.map(([a,r])=>`${a} ${r}`)?.join(",");return{statement:`CREATE TABLE IF NOT EXISTS ${e?.table} (${t})`,columns:t}},add_column:(e={})=>({statement:`ALTER TABLE ${e?.table} ADD COLUMN IF NOT EXISTS ${e?.column_name} ${e?.column_type}`}),select:(e={})=>{const t=Array.isArray(e?.columns)?e?.columns?.join(","):"*",r=Object.entries(e?.where)?.map(([n],c)=>`${n} = $${c+1}`)?.join(",");return{statement:`SELECT ${t} FROM ${e?.table} ${e?.where?`WHERE ${r}`:""}`,column_names:t,where:r,values:Object.values(e?.where)}},insert:(e={})=>{const t=Object.keys(e?.data)?.join(","),a=Object.keys(e?.data)?.map((r,n)=>`$${n+1}`)?.join(",");return{statement:`INSERT INTO ${e?.table} (${t}) VALUES (${a})`,column_names:t,value_placeholders:a,values:Object.values(e?.data)}},update:(e={})=>{const t=Object.entries(e?.where),a=Object.keys(e?.data).map((n,c)=>`${n} = $${t.length+c+1}`)?.join(","),r=t?.map(([n],c)=>`${n} = $${c+1}`)?.join(",");return{statement:`UPDATE ${e?.table} SET ${a} WHERE ${r}`,sets:a,where:r,values:[...Object.values(e?.where),...Object.values(e?.data)]}}};var s=l;export{s as default};
@@ -0,0 +1 @@
1
+ import d from"chalk";import{htmlToText as _}from"html-to-text";import w from"juice";import b from"nodemailer";import j from"../../lib/dynamic_import.js";import x from"../../lib/get_joystick_build_path.js";import y from"../../lib/get_translations.js";import T from"../settings/load.js";import v from"../../lib/path_exists.js";import $ from"../ssr/index.js";import k from"../../test/track_function_call.js";import E from"./validate_smtp_settings.js";const r=T(),I=async(t={},e={})=>{if(process.env.NODE_ENV==="test"){k("node.email.send",[t]);return}const a=E(r?.config?.email?.smtp);if(!a)return console.warn(d.redBright("Invalid SMTP settings. Cannot send email.")),Promise.resolve(null);const s=parseInt(e?.port||r?.config?.email?.smtp?.port,10),l=s===465||![25,587].includes(s),p=a?b.createTransport({host:e?.host||r?.config?.email?.smtp?.host,port:s,secure:l,auth:{user:e?.username||r?.config?.email?.smtp?.username,pass:e?.password||r?.config?.email?.smtp?.password}}):null,m=x(),n=`${m}email/${t?.template}.js`,c=t?.template&&await v(n),o={from:r?.config?.email?.from,...t};if(e?.headers&&(o.headers=e?.headers),c){const u=await j(`${n}?v=${new Date().getTime()}`),f=await y({is_email:!0,email_template_name:t?.template,joystick_build_path:m,req:{context:{user:t?.user}}}),i=await $({is_email:!0,component_options:{props:t?.props,translations:f},component_to_render:u,email_options:{base_html_name:t?.base,subject:t?.subject,preheader:t?.preheader}}),h=_(i),g=w(i,{preserveMediaQueries:!0,preserveImportant:!0,removeStyleTags:!1});return o.html=g,o.text=h,p.sendMail(o)}return console.warn(`Email template at /email/${t?.template}.js could not be found.`),Promise.resolve()};var A=I;export{A as default};
@@ -0,0 +1 @@
1
+ import e from"chalk";const s=(n=null)=>n?n&&!n.host?(console.warn(e.redBright(`Invalid SMTP settings: config.smtp.host not defined in settings.${process.env.NODE_ENV}.js`)),!1):n&&!n.port?(console.warn(e.redBright(`Invalid SMTP settings: config.smtp.port not defined in settings.${process.env.NODE_ENV}.js`)),!1):n&&!n.username?(console.warn(e.redBright(`Invalid SMTP settings: config.smtp.username not defined in settings.${process.env.NODE_ENV}.js`)),!1):n&&!n.password?(console.warn(e.redBright(`Invalid SMTP settings: config.smtp.password not defined in settings.${process.env.NODE_ENV}.js`)),!1):!0:(console.warn(e.redBright(`Invalid SMTP settings: config.smtp not defined in settings.${process.env.NODE_ENV}.js`)),!1);var t=s;export{t as default};
@@ -0,0 +1 @@
1
+ import e from"../../lib/types.js";class a{constructor(t={}){return this.options=t,this.quantity=t?.quantity,this.run=this.run.bind(this),this.run}async run(t={}){this.input=t;const s=typeof this?.options?.skip=="function"?await this.options.skip(this,t):!1;let i=[];s||(i=await this.generate_data_to_create(t),(e.is_function(this?.options?.onCreate)||e.is_function(this?.options?.on_create))&&await(this.options.onCreate||this.options.on_create)(this,i,(o={})=>(this?.options?.onAfterCreateEach||this.options.on_after_create_each)(this,o,t))),(e.is_function(this?.options?.onAfterCreateAll)||e.is_function(this?.options?.on_after_create_all))&&(this.options.onAfterCreateAll||this.options.on_after_create_all)(this,i,t)}async generate_data_to_create(t={}){const s=[];for(let i=0;i<this?.quantity;i+=1)if(typeof this?.options?.template=="function"){const o=await this.options?.template(this,i,t);s.push(o)}return s}}var h=(n={})=>new a(n);export{h as default};
@@ -0,0 +1 @@
1
+ import e from"fs";import o from"os";import a from"path";import r from"../lib/generate_id.js";import c from"../lib/path_exists.js";const{mkdir:m,writeFile:s,readFile:n}=e.promises,_=async()=>{const i=`${o.homedir()}/.cheatcode/MACHINE_ID`;if(!await c(i)){const t=r(32);return await m(a.dirname(i),{recursive:!0}),await s(i,t),t}return(await n(i,"utf-8"))?.trim()};var w=_;export{w as default};
@@ -0,0 +1 @@
1
+ import _ from"fs";import i from"../lib/generate_id.js";import o from"../lib/path_exists.js";const{mkdir:a,writeFile:p,readFile:n}=_.promises,d=async()=>{const s="./.joystick",t="./.joystick/PROCESS_ID",r=await o(s),c=await o(t);if(r||await a(s),!c){const e=i(32);return await p(t,`${i(32)}`),e}return(await n(t,"utf-8"))?.trim()};var m=d;export{m as default};
@@ -0,0 +1 @@
1
+ import e from"fs";const p=(c=null)=>{const r="/root/push/certs/cert.pem",n="/root/push/certs/key.pem",t=process.env.IS_PUSH_DEPLOYED?r:c?.certificate||null,s=process.env.IS_PUSH_DEPLOYED?n:c?.key||null,i=t&&e.existsSync(t),o=s&&e.existsSync(s);return["development","test"].includes(process.env.NODE_ENV)||!i||!o?null:{cert:e.readFileSync(t),key:e.readFileSync(s)}};var l=p;export{l as default};
@@ -0,0 +1 @@
1
+ const a=(o={})=>{process.on("disconnect",async()=>{o?.disconnect&&typeof o.disconnect=="function"&&o.disconnect()}),process.on("beforeExit",async c=>{o?.beforeExit&&typeof o.beforeExit=="function"&&o.beforeExit(c)}),process.on("exit",async c=>{o?.exit&&typeof o.exit=="function"&&o.exit(c)}),process.on("message",async(c,f)=>{process.env.NODE_ENV!=="test"&&console.log(c),o?.message&&typeof o.message=="function"&&o.message(c,f)}),process.on("multipleResolves",async(c,f,p)=>{o?.multipleResolves&&typeof o.multipleResolves=="function"&&o.multipleResolves(c,f,p)}),process.on("rejectionHandled",async c=>{o?.rejectionHandled&&typeof o.rejectionHandled=="function"&&o.rejectionHandled(c)}),process.on("uncaughtException",async(c,f)=>{console.warn(c),o?.error&&typeof o.error=="function"&&o.error(c),o?.uncaughtException&&typeof o.uncaughtException=="function"&&o.uncaughtException(c,f)}),process.on("uncaughtExceptionMonitor",async c=>{o?.uncaughtExceptionMonitor&&typeof o.uncaughtExceptionMonitor=="function"&&o.uncaughtExceptionMonitor(c)}),process.on("unhandledRejection",async c=>{console.warn(c),o?.error&&typeof o.error=="function"&&o.error(c),o?.unhandledRejection&&typeof o.unhandledRejection=="function"&&o.unhandledRejection(c)}),process.on("warning",async c=>{o?.warning&&typeof o.warning=="function"&&o.warning(c)}),process.on("worker",async c=>{o?.worker&&typeof o.worker=="function"&&o.worker(c)})};var u=a;export{u as default};