@joystick.js/node-canary 0.0.0-canary.47 → 0.0.0-canary.470
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.
- package/.build/getFilesToBuild.js +26 -0
- package/.build/getPlatformSafeFilePath.js +6 -0
- package/.build/getPlatformSafePath.js +6 -0
- package/.build/index.js +88 -0
- package/.build/isWindows.js +3 -0
- package/dist/action/class.js +1 -82
- package/dist/action/index.js +1 -8
- package/dist/app/accounts/default_user_output_fields.js +1 -0
- package/dist/app/accounts/delete_user.js +1 -0
- package/dist/app/accounts/generate_account_session.js +1 -0
- package/dist/app/accounts/generate_password_reset_token.js +1 -0
- package/dist/app/accounts/get_browser_safe_user.js +1 -0
- package/dist/app/accounts/has_login_token_expired.js +1 -0
- package/dist/app/accounts/index.js +1 -29
- package/dist/app/accounts/login.js +1 -59
- package/dist/app/accounts/recover_password.js +1 -0
- package/dist/app/accounts/reset_password.js +1 -0
- package/dist/app/accounts/roles/add.js +1 -7
- package/dist/app/accounts/roles/grant.js +1 -7
- package/dist/app/accounts/roles/index.js +1 -17
- package/dist/app/accounts/roles/list.js +1 -7
- package/dist/app/accounts/roles/remove.js +1 -7
- package/dist/app/accounts/roles/revoke.js +1 -7
- package/dist/app/accounts/roles/user_has_role.js +1 -0
- package/dist/app/accounts/send_email_verification.js +1 -0
- package/dist/app/accounts/set_account_cookie.js +1 -0
- package/dist/app/accounts/set_password.js +1 -0
- package/dist/app/accounts/signup.js +1 -97
- package/dist/app/accounts/unset_account_cookie.js +1 -0
- package/dist/app/accounts/verify_email.js +1 -0
- package/dist/app/api/accounts/authenticated.js +1 -0
- package/dist/app/api/accounts/login.js +1 -0
- package/dist/app/api/accounts/logout.js +1 -0
- package/dist/app/api/accounts/recover_password.js +1 -0
- package/dist/app/api/accounts/reset_password.js +1 -0
- package/dist/app/api/accounts/signup.js +1 -0
- package/dist/app/api/accounts/user.js +1 -0
- package/dist/app/api/accounts/verify_email.js +1 -0
- package/dist/app/api/format_api_error.js +1 -0
- package/dist/app/api/get.js +2 -0
- package/dist/app/api/get_api_context.js +1 -0
- package/dist/app/api/get_api_for_data_functions.js +1 -0
- package/dist/app/api/get_api_url_component.js +1 -0
- package/dist/app/api/get_output.js +1 -0
- package/dist/app/api/get_value_from_object.js +1 -0
- package/dist/app/api/handle_api_error.js +1 -0
- package/dist/app/api/input_validators.js +1 -0
- package/dist/app/api/is_array_path.js +1 -0
- package/dist/app/api/push/health.js +2 -0
- package/dist/app/api/register_getters.js +1 -0
- package/dist/app/api/register_setters.js +1 -0
- package/dist/app/api/sanitize_api_response.js +1 -0
- package/dist/app/api/set.js +2 -0
- package/dist/app/api/test/accounts/delete.js +1 -0
- package/dist/app/api/test/accounts/signup.js +1 -0
- package/dist/app/api/test/bootstrap.js +1 -0
- package/dist/app/api/test/process.js +1 -0
- package/dist/app/api/test/queues.js +1 -0
- package/dist/app/api/validate_input.js +1 -0
- package/dist/app/api/validate_session.js +1 -0
- package/dist/app/api/validate_type.js +1 -0
- package/dist/app/browser/hmr_client.js +1 -0
- package/dist/app/browser/process_polyfill.js +1 -0
- package/dist/app/cron_jobs/register.js +1 -0
- package/dist/app/databases/database_type_map.js +1 -0
- package/dist/app/databases/get_target_database_connection.js +1 -0
- package/dist/app/databases/mongodb/available_query_parameters.js +1 -0
- package/dist/app/databases/mongodb/build_connection_string.js +1 -0
- package/dist/app/databases/mongodb/build_query_parameters.js +1 -0
- package/dist/app/databases/mongodb/connect.js +6 -0
- package/dist/app/databases/mongodb/create_indexes.js +1 -0
- package/dist/app/databases/postgresql/accounts/create_accounts_metadata_table_columns.js +1 -0
- package/dist/app/databases/postgresql/connect.js +30 -0
- package/dist/app/databases/postgresql/create_indexes.js +1 -0
- package/dist/app/databases/postgresql/create_tables.js +1 -0
- package/dist/app/databases/postgresql/handle_cleanup_queues.js +5 -0
- package/dist/app/databases/postgresql/handle_cleanup_sessions.js +1 -0
- package/dist/app/databases/queries/accounts.js +1 -0
- package/dist/app/databases/queries/map.js +1 -0
- package/dist/app/databases/queries/mongodb/accounts.js +1 -0
- package/dist/app/databases/queries/mongodb/queues.js +1 -0
- package/dist/app/databases/queries/mongodb/sessions.js +1 -0
- package/dist/app/databases/queries/postgresql/accounts.js +1 -0
- package/dist/app/databases/queries/postgresql/queues.js +123 -0
- package/dist/app/databases/queries/postgresql/sessions.js +14 -0
- package/dist/app/databases/queries/sessions.js +1 -0
- package/dist/app/databases/register_database.js +1 -0
- package/dist/app/databases/sql.js +1 -0
- package/dist/app/email/send.js +1 -0
- package/dist/app/email/validate_smtp_settings.js +1 -0
- package/dist/app/fixture/index.js +1 -0
- package/dist/app/generate_machine_id.js +1 -0
- package/dist/app/generate_process_id.js +1 -0
- package/dist/app/get_ssl_certificates.js +1 -0
- package/dist/app/handle_process_errors.js +1 -0
- package/dist/app/index.js +1 -656
- package/dist/app/middleware/account.js +1 -0
- package/dist/app/middleware/body_parser.js +1 -0
- package/dist/app/middleware/build_error.js +1 -0
- package/dist/app/middleware/built_in.js +1 -0
- package/dist/app/middleware/context.js +1 -0
- package/dist/app/middleware/cors.js +1 -22
- package/dist/app/middleware/csp.js +1 -48
- package/dist/app/middleware/generate_insecure_page.js +65 -0
- package/dist/app/middleware/generate_joystick_error_page.js +147 -0
- package/dist/app/middleware/hmr_client.js +1 -0
- package/dist/app/middleware/insecure.js +1 -11
- package/dist/app/middleware/process_browser_polyfill.js +1 -0
- package/dist/app/middleware/render/get_url.js +1 -0
- package/dist/app/middleware/render/index.js +1 -0
- package/dist/app/middleware/request_methods.js +1 -0
- package/dist/app/middleware/session.js +1 -24
- package/dist/app/push_logs.js +1 -0
- package/dist/app/queues/index.js +1 -119
- package/dist/app/register_app_options.js +1 -0
- package/dist/app/routes/register_route_from_function.js +1 -0
- package/dist/app/routes/register_route_from_object.js +1 -0
- package/dist/app/routes/supported_http_methods.js +1 -0
- package/dist/app/settings/load.js +1 -0
- package/dist/app/ssr/index.js +33 -0
- package/dist/app/ssr/set_base_attributes_in_html.js +1 -0
- package/dist/app/ssr/set_head_tags_in_html.js +1 -0
- package/dist/app/start_express.js +1 -0
- package/dist/app/start_node_as_cluster.js +1 -0
- package/dist/app/uploaders/local_upload_progress_middleware.js +1 -0
- package/dist/app/uploaders/register.js +1 -0
- package/dist/app/uploaders/run_upload.js +1 -0
- package/dist/app/uploaders/validate_options.js +1 -0
- package/dist/app/uploaders/validate_uploads.js +1 -0
- package/dist/app/websockets/emit_event.js +1 -0
- package/dist/app/websockets/index.js +1 -0
- package/dist/app/websockets/register.js +1 -0
- package/dist/index.js +4 -76
- package/dist/lib/camel_pascal_to_snake.js +1 -0
- package/dist/lib/constants.js +1 -13
- package/dist/lib/dynamic_import.js +1 -0
- package/dist/lib/escape_html.js +1 -0
- package/dist/lib/escape_key_value_pair.js +1 -0
- package/dist/lib/float_to_decimal_place.js +1 -0
- package/dist/lib/generate_id.js +1 -0
- package/dist/lib/get_browser_safe_request.js +1 -0
- package/dist/lib/get_joystick_build_path.js +1 -0
- package/dist/lib/get_origin.js +1 -0
- package/dist/lib/get_platform_safe_path.js +1 -0
- package/dist/lib/get_sanitized_context.js +1 -0
- package/dist/lib/get_translations.js +1 -0
- package/dist/lib/hash_string.js +1 -0
- package/dist/lib/is_valid_json.js +1 -0
- package/dist/lib/log.js +13 -49
- package/dist/lib/node_path_polyfills.js +1 -0
- package/dist/lib/parse_json.js +1 -0
- package/dist/lib/path_exists.js +1 -0
- package/dist/lib/rainbow_road.js +1 -0
- package/dist/lib/serialize_query_parameters.js +1 -0
- package/dist/lib/set_cookie.js +1 -0
- package/dist/lib/string_to_slug.js +1 -0
- package/dist/lib/timestamps.js +1 -0
- package/dist/lib/types.js +1 -0
- package/dist/lib/unset_cookie.js +1 -0
- package/dist/lib/wait.js +1 -0
- package/dist/test/track_function_call.js +1 -0
- package/increment_version.js +3 -0
- package/package.json +27 -44
- package/src/action/class.js +137 -0
- package/src/action/index.js +8 -0
- package/src/app/accounts/default_user_output_fields.js +10 -0
- package/src/app/accounts/delete_user.js +18 -0
- package/src/app/accounts/generate_account_session.js +11 -0
- package/src/app/accounts/generate_password_reset_token.js +16 -0
- package/src/app/accounts/get_browser_safe_user.js +29 -0
- package/src/app/accounts/has_login_token_expired.js +9 -0
- package/src/app/accounts/index.js +38 -0
- package/src/app/accounts/login.js +82 -0
- package/src/app/accounts/recover_password.js +58 -0
- package/src/app/accounts/reset_password.js +69 -0
- package/src/app/accounts/roles/add.js +7 -0
- package/src/app/accounts/roles/grant.js +7 -0
- package/src/app/accounts/roles/index.js +18 -0
- package/src/app/accounts/roles/list.js +7 -0
- package/src/app/accounts/roles/remove.js +7 -0
- package/src/app/accounts/roles/revoke.js +7 -0
- package/src/app/accounts/roles/user_has_role.js +7 -0
- package/src/app/accounts/send_email_verification.js +48 -0
- package/src/app/accounts/set_account_cookie.js +12 -0
- package/src/app/accounts/set_password.js +46 -0
- package/src/app/accounts/signup.js +158 -0
- package/src/app/accounts/unset_account_cookie.js +12 -0
- package/src/app/accounts/verify_email.js +32 -0
- package/src/app/api/accounts/authenticated.js +17 -0
- package/src/app/api/accounts/login.js +36 -0
- package/src/app/api/accounts/logout.js +20 -0
- package/src/app/api/accounts/recover_password.js +16 -0
- package/src/app/api/accounts/reset_password.js +24 -0
- package/src/app/api/accounts/signup.js +49 -0
- package/src/app/api/accounts/user.js +21 -0
- package/src/app/api/accounts/verify_email.js +11 -0
- package/src/app/api/format_api_error.js +10 -0
- package/src/app/api/get.js +119 -0
- package/src/app/api/get_api_context.js +27 -0
- package/src/app/api/get_api_for_data_functions.js +37 -0
- package/src/app/api/get_api_url_component.js +5 -0
- package/src/app/api/get_output.js +116 -0
- package/src/app/api/get_value_from_object.js +8 -0
- package/src/app/api/handle_api_error.js +28 -0
- package/src/app/api/input_validators.js +227 -0
- package/src/app/api/is_array_path.js +6 -0
- package/src/app/api/push/health.js +17 -0
- package/src/app/api/register_getters.js +57 -0
- package/src/app/api/register_setters.js +55 -0
- package/src/app/api/sanitize_api_response.js +35 -0
- package/src/app/api/set.js +119 -0
- package/src/app/api/test/accounts/delete.js +8 -0
- package/src/app/api/test/accounts/signup.js +50 -0
- package/src/app/api/test/bootstrap.js +39 -0
- package/src/app/api/test/process.js +7 -0
- package/src/app/api/test/queues.js +25 -0
- package/src/app/api/validate_input.js +130 -0
- package/src/app/api/validate_session.js +20 -0
- package/src/app/api/validate_type.js +24 -0
- package/src/app/browser/hmr_client.js +196 -0
- package/src/app/browser/process_polyfill.js +11 -0
- package/src/app/cron_jobs/register.js +29 -0
- package/src/app/databases/database_type_map.js +6 -0
- package/src/app/databases/get_target_database_connection.js +25 -0
- package/{dist/app/databases/mongodb/availableQueryParameters.js → src/app/databases/mongodb/available_query_parameters.js} +3 -4
- package/src/app/databases/mongodb/build_connection_string.js +30 -0
- package/src/app/databases/mongodb/build_query_parameters.js +17 -0
- package/src/app/databases/mongodb/connect.js +42 -0
- package/src/app/databases/mongodb/create_indexes.js +35 -0
- package/src/app/databases/postgresql/accounts/create_accounts_metadata_table_columns.js +18 -0
- package/src/app/databases/postgresql/connect.js +128 -0
- package/src/app/databases/postgresql/create_indexes.js +58 -0
- package/src/app/databases/postgresql/create_tables.js +70 -0
- package/src/app/databases/postgresql/handle_cleanup_queues.js +36 -0
- package/src/app/databases/postgresql/handle_cleanup_sessions.js +5 -0
- package/src/app/databases/queries/accounts.js +17 -0
- package/src/app/databases/queries/map.js +21 -0
- package/src/app/databases/queries/mongodb/accounts.js +360 -0
- package/src/app/databases/queries/mongodb/queues.js +164 -0
- package/src/app/databases/queries/mongodb/sessions.js +22 -0
- package/src/app/databases/queries/postgresql/accounts.js +379 -0
- package/src/app/databases/queries/postgresql/queues.js +294 -0
- package/src/app/databases/queries/postgresql/sessions.js +37 -0
- package/src/app/databases/queries/sessions.js +17 -0
- package/src/app/databases/register_database.js +30 -0
- package/src/app/databases/sql.js +63 -0
- package/src/app/email/send.js +108 -0
- package/src/app/email/validate_smtp_settings.js +53 -0
- package/src/app/fixture/index.js +50 -0
- package/src/app/generate_machine_id.js +26 -0
- package/src/app/generate_process_id.js +30 -0
- package/src/app/get_ssl_certificates.js +23 -0
- package/src/app/handle_process_errors.js +101 -0
- package/src/app/index.js +253 -0
- package/src/app/middleware/account.js +28 -0
- package/src/app/middleware/body_parser.js +18 -0
- package/src/app/middleware/build_error.js +18 -0
- package/src/app/middleware/built_in.js +76 -0
- package/src/app/middleware/context.js +34 -0
- package/src/app/middleware/cors.js +23 -0
- package/src/app/middleware/csp.js +54 -0
- package/src/app/middleware/generate_insecure_page.js +71 -0
- package/{dist/lib/generateErrorPage.js → src/app/middleware/generate_joystick_error_page.js} +25 -21
- package/src/app/middleware/hmr_client.js +12 -0
- package/src/app/middleware/insecure.js +22 -0
- package/src/app/middleware/process_browser_polyfill.js +12 -0
- package/src/app/middleware/render/get_url.js +15 -0
- package/src/app/middleware/render/index.js +93 -0
- package/src/app/middleware/request_methods.js +21 -0
- package/src/app/middleware/session.js +31 -0
- package/src/app/push_logs.js +44 -0
- package/src/app/queues/index.js +268 -0
- package/src/app/register_app_options.js +7 -0
- package/src/app/routes/register_route_from_function.js +10 -0
- package/src/app/routes/register_route_from_object.js +34 -0
- package/src/app/routes/supported_http_methods.js +9 -0
- package/src/app/settings/load.js +33 -0
- package/src/app/ssr/index.js +133 -0
- package/src/app/ssr/set_base_attributes_in_html.js +43 -0
- package/src/app/ssr/set_head_tags_in_html.js +104 -0
- package/src/app/start_express.js +50 -0
- package/src/app/start_node_as_cluster.js +30 -0
- package/src/app/uploaders/local_upload_progress_middleware.js +24 -0
- package/src/app/uploaders/register.js +169 -0
- package/src/app/uploaders/run_upload.js +136 -0
- package/src/app/uploaders/validate_options.js +74 -0
- package/src/app/uploaders/validate_uploads.js +127 -0
- package/src/app/websockets/emit_event.js +14 -0
- package/src/app/websockets/index.js +16 -0
- package/src/app/websockets/register.js +175 -0
- package/src/index.js +81 -0
- package/{dist/lib/camelPascalToSnake.js → src/lib/camel_pascal_to_snake.js} +3 -4
- package/src/lib/constants.js +21 -0
- package/src/lib/dynamic_import.js +8 -0
- package/src/lib/escape_html.js +9 -0
- package/src/lib/escape_key_value_pair.js +15 -0
- package/src/lib/float_to_decimal_place.js +5 -0
- package/src/lib/generate_id.js +15 -0
- package/src/lib/get_browser_safe_request.js +17 -0
- package/src/lib/get_joystick_build_path.js +22 -0
- package/src/lib/get_origin.js +7 -0
- package/src/lib/get_platform_safe_path.js +8 -0
- package/src/lib/get_sanitized_context.js +51 -0
- package/src/lib/get_translations.js +109 -0
- package/src/lib/hash_string.js +7 -0
- package/src/lib/is_valid_json.js +10 -0
- package/src/lib/log.js +42 -0
- package/src/lib/node_path_polyfills.js +23 -0
- package/src/lib/parse_json.js +9 -0
- package/src/lib/path_exists.js +12 -0
- package/src/lib/rainbow_road.js +7 -0
- package/src/lib/serialize_query_parameters.js +7 -0
- package/src/lib/set_cookie.js +16 -0
- package/src/lib/string_to_slug.js +14 -0
- package/src/lib/timestamps.js +48 -0
- package/src/lib/types.js +59 -0
- package/src/lib/unset_cookie.js +11 -0
- package/src/lib/wait.js +9 -0
- package/src/test/track_function_call.js +16 -0
- package/README.md +0 -8
- package/_package.json +0 -63
- package/canary.js +0 -12
- package/dist/api/get.js +0 -29
- package/dist/api/getOrigin.js +0 -6
- package/dist/api/index.js +0 -9
- package/dist/api/set.js +0 -29
- package/dist/app/accounts/defaultUserOutputFields.js +0 -9
- package/dist/app/accounts/generateResetToken.js +0 -28
- package/dist/app/accounts/generateSession.js +0 -15
- package/dist/app/accounts/getBrowserSafeUser.js +0 -24
- package/dist/app/accounts/hasLoginTokenExpired.js +0 -17
- package/dist/app/accounts/hashString.js +0 -7
- package/dist/app/accounts/recoverPassword.js +0 -30
- package/dist/app/accounts/resetPassword.js +0 -73
- package/dist/app/accounts/roles/userHasRole.js +0 -7
- package/dist/app/accounts/runUserQuery.js +0 -15
- package/dist/app/accounts/sendEmailVerification.js +0 -65
- package/dist/app/accounts/setAuthenticationCookie.js +0 -11
- package/dist/app/accounts/setPassword.js +0 -45
- package/dist/app/accounts/unsetAuthenticationCookie.js +0 -11
- package/dist/app/accounts/verifyEmail.js +0 -46
- package/dist/app/databases/getTargetDatabase.js +0 -10
- package/dist/app/databases/getTargetDatabaseConnection.js +0 -19
- package/dist/app/databases/getTargetDatabaseProvider.js +0 -10
- package/dist/app/databases/mongodb/buildConnectionString.js +0 -22
- package/dist/app/databases/mongodb/buildQueryParameters.js +0 -14
- package/dist/app/databases/mongodb/index.js +0 -40
- package/dist/app/databases/mongodb/queries/accounts.js +0 -266
- package/dist/app/databases/mongodb/queries/queues.js +0 -111
- package/dist/app/databases/postgresql/addColumnToTable.js +0 -6
- package/dist/app/databases/postgresql/createAccountsIndexes.js +0 -21
- package/dist/app/databases/postgresql/createAccountsTables.js +0 -39
- package/dist/app/databases/postgresql/createDatabase.js +0 -0
- package/dist/app/databases/postgresql/index.js +0 -55
- package/dist/app/databases/postgresql/queries/accounts.js +0 -186
- package/dist/app/databases/postgresql/queries/queues.js +0 -211
- package/dist/app/databases/queryMap.js +0 -17
- package/dist/app/databases/typesMap.js +0 -7
- package/dist/app/getAPIContext.js +0 -25
- package/dist/app/getAPIURLComponent.js +0 -6
- package/dist/app/getBrowserSafeRequest.js +0 -14
- package/dist/app/getOutput.js +0 -74
- package/dist/app/handleProcessErrors.js +0 -73
- package/dist/app/initExpress.js +0 -41
- package/dist/app/middleware/bodyParser.js +0 -16
- package/dist/app/middleware/hmr/client.js +0 -113
- package/dist/app/middleware/index.js +0 -89
- package/dist/app/middleware/render.js +0 -213
- package/dist/app/middleware/requestMethods.js +0 -19
- package/dist/app/registerGetters.js +0 -45
- package/dist/app/registerSetters.js +0 -45
- package/dist/app/runGetter.js +0 -103
- package/dist/app/runSetter.js +0 -103
- package/dist/app/runUploader.js +0 -143
- package/dist/app/sanitizeAPIResponse.js +0 -27
- package/dist/app/utils/process.js +0 -193
- package/dist/app/validateSession.js +0 -19
- package/dist/app/validateUploaderOptions.js +0 -53
- package/dist/app/validateUploads.js +0 -102
- package/dist/email/render.js +0 -50
- package/dist/email/send.js +0 -55
- package/dist/email/templates/base.css +0 -194
- package/dist/email/templates/base.html +0 -28
- package/dist/email/templates/reset-password.js +0 -13
- package/dist/email/validateSMTPSettings.js +0 -27
- package/dist/lib/escapeHTML.js +0 -9
- package/dist/lib/escapeKeyValuePair.js +0 -13
- package/dist/lib/formatAPIError.js +0 -12
- package/dist/lib/formatErrorString.js +0 -8
- package/dist/lib/generateCookie.js +0 -14
- package/dist/lib/generateId.js +0 -13
- package/dist/lib/generateMachineId.js +0 -15
- package/dist/lib/getBuildPath.js +0 -10
- package/dist/lib/getErrorObject.js +0 -9
- package/dist/lib/getPlatformSafeFilePath.js +0 -8
- package/dist/lib/getPlatformSafePath.js +0 -8
- package/dist/lib/getSSLCertificates.js +0 -19
- package/dist/lib/isValidHTTPMethod.js +0 -7
- package/dist/lib/isValidJSONString.js +0 -11
- package/dist/lib/nodeUrlPolyfills.js +0 -14
- package/dist/lib/objectToSQLKeysString.js +0 -18
- package/dist/lib/objectToSQLValuesString.js +0 -16
- package/dist/lib/obscenedb/debounce.js +0 -12
- package/dist/lib/obscenedb/index.js +0 -61
- package/dist/lib/parseDatabasesFromEnvironment.js +0 -9
- package/dist/lib/rainbowRoad.js +0 -7
- package/dist/lib/readDirectory.js +0 -24
- package/dist/lib/replaceBackslashesWithForwardSlashes.js +0 -8
- package/dist/lib/replaceFileProtocol.js +0 -8
- package/dist/lib/replaceForwardSlashesWithBackslashes.js +0 -8
- package/dist/lib/serializeQueryParameters.js +0 -8
- package/dist/lib/serverAvailable.js +0 -0
- package/dist/lib/setCookie.js +0 -16
- package/dist/lib/supportedHTTPMethods.js +0 -4
- package/dist/lib/unsetCookie.js +0 -13
- package/dist/push/logs/index.js +0 -55
- package/dist/settings/index.js +0 -5
- package/dist/settings/load.js +0 -30
- package/dist/ssr/compileCSS.js +0 -85
- package/dist/ssr/findComponentInTree.js +0 -29
- package/dist/ssr/formatCSS.js +0 -6
- package/dist/ssr/getCSSFromTree.js +0 -33
- package/dist/ssr/index.js +0 -441
- package/dist/ssr/replaceWhenTags.js +0 -37
- package/dist/ssr/setHeadTagsInHTML.js +0 -84
- package/dist/validation/index.js +0 -10
- package/dist/validation/index.test.js +0 -463
- package/dist/validation/inputWithSchema/index.js +0 -105
- package/dist/validation/lib/constants.js +0 -162
- package/dist/validation/lib/getValueFromObject.js +0 -12
- package/dist/validation/lib/getValueFromObject.test.js +0 -7
- package/dist/validation/lib/isArrayPath.js +0 -6
- package/dist/validation/lib/throwError.js +0 -6
- package/dist/validation/lib/typeValidators.js +0 -38
- package/dist/validation/lib/validateType.js +0 -33
- package/dist/validation/schema/index.js +0 -44
- package/dist/websockets/emitWebsocketEvent.js +0 -12
- package/dist/websockets/index.js +0 -12
- package/notes +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import a from"compression";import _ from"cookie-parser";import c from"cors";import i from"express";import m from"serve-favicon";import t from"./account.js";import d from"./body_parser.js";import u from"./build_error.js";import f from"./context.js";import l from"../../lib/get_joystick_build_path.js";import x from"./hmr_client.js";import o from"./insecure.js";import b from"../../lib/path_exists.js";import w from"./process_browser_polyfill.js";import y from"./render/index.js";import j from"./request_methods.js";import v from"./session.js";const k=l(),n=(e={})=>{e.express_app.set("trust proxy",1),["development","test"].includes(process.env.NODE_ENV)||e.express_app.use(o),e.express_app.use(u),e.express_app.use(j),e?.csp_config&&e.express_app.use((r,p,s)=>csp(r,p,s,e?.csp_config)),process.env.NODE_ENV!=="development"&&e.express_app.use(a()),e.express_app.use(i.static("public")),e.express_app.use("/css",i.static("css")),e.express_app.use("/_joystick/utils/process.js",w),e.express_app.use("/_joystick/index.client.js",i.static(`${e?.joystick_build_path}index.client.js`)),e.express_app.use("/_joystick/index.css",i.static(`${e?.joystick_build_path}index.css`)),e.express_app.use("/_joystick/ui",i.static(`${k}ui`)),process.env.NODE_ENV==="development"&&e.express_app.use("/_joystick/hmr/client.js",x),e.express_app.use(async(r,p,s)=>{await b("public/favicon.ico")?m("public/favicon.ico")(r,p,s):s()}),e.express_app.use(_()),e.express_app.use(d(e?.middleware_config?.bodyParser)),e.express_app.use(c(e?.middleware_config?.cors,e?.port)),process.databases?._sessions&&e.express_app.use((r,p,s)=>v(r,p,s)),process.databases?._users&&e.express_app.use((r,p,s)=>t(r,p,s)),e.express_app.use((r,p,s)=>f(r,p,s)),e.express_app.use((r,p,s)=>y(r,p,s,e?.app_instance))};var J=n;export{J as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const g=(n="",e=null,o={})=>{if(o?.req?.context?.user&&n)return o?.res.redirect(n);if(e)return e()},f=(n="",e=null,o={})=>{if(!o?.req?.context?.user&&n)return o?.res.redirect(n);if(e)return e()},d=async(n,e,o)=>{n.context={...n?.context||{},if_logged_in:(t="",i)=>g(t,i,{req:n,res:e}),ifLoggedIn:(t="",i)=>g(t,i,{req:n,res:e}),if_not_logged_in:(t="",i)=>f(t,i,{req:n,res:e}),ifNotLoggedIn:(t="",i)=>f(t,i,{req:n,res:e}),...process.databases||{}},o()};var r=d;export{r as default};
|
|
@@ -1,22 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
var cors_default = (config = {}, port = "") => {
|
|
3
|
-
return (req, res, next) => {
|
|
4
|
-
const allowedUrls = [
|
|
5
|
-
`http://localhost:${port}`,
|
|
6
|
-
...config?.allowedUrls || []
|
|
7
|
-
];
|
|
8
|
-
return cors({
|
|
9
|
-
credentials: true,
|
|
10
|
-
origin: function(origin, callback) {
|
|
11
|
-
if (!origin || allowedUrls.includes(origin)) {
|
|
12
|
-
callback(null, true);
|
|
13
|
-
} else {
|
|
14
|
-
callback(new Error(`${origin} not permitted by CORS policy.`));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
})(req, res, next);
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
export {
|
|
21
|
-
cors_default as default
|
|
22
|
-
};
|
|
1
|
+
import d from"cors";const c=(t={},l="")=>(o,n,s)=>{const u=[`http://localhost:${l}`,...t?.allowedUrls||[]];return d({credentials:!0,origin:function(e,r){!e||u.includes(e)?r(null,!0):r(new Error(`${e} not permitted by CORS policy.`))}})(o,n,s)};var p=c;export{p as default};
|
|
@@ -1,48 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
var csp_default = (req, res, next, config = null) => {
|
|
3
|
-
if (config && isObject(config)) {
|
|
4
|
-
const directiveDefaults = {
|
|
5
|
-
"default-src": ["'self'"],
|
|
6
|
-
"child-src": ["'self'"],
|
|
7
|
-
"connect-src": ["'self'", "wss:"],
|
|
8
|
-
"font-src": ["'self'"],
|
|
9
|
-
"frame-src": ["'self'"],
|
|
10
|
-
"img-src": ["'self'"],
|
|
11
|
-
"manifest-src": ["'self'"],
|
|
12
|
-
"media-src": ["'self'"],
|
|
13
|
-
"object-src": ["'self'"],
|
|
14
|
-
"script-src": ["'self'"],
|
|
15
|
-
"script-src-elem": ["'self'"],
|
|
16
|
-
"script-src-attr": ["'self'"],
|
|
17
|
-
"style-src": ["'self'"],
|
|
18
|
-
"style-src-elem": ["'self'"],
|
|
19
|
-
"style-src-attr": ["'self'"],
|
|
20
|
-
"worker-src": ["'self'"],
|
|
21
|
-
"base-uri": ["'self'"],
|
|
22
|
-
"navigate-to": ["'self'"],
|
|
23
|
-
"form-action": ["'self'"]
|
|
24
|
-
};
|
|
25
|
-
const { unrestrictedOrigins, directives } = config;
|
|
26
|
-
if (process.env.NODE_ENV === "development") {
|
|
27
|
-
directiveDefaults["script-src"].push("'unsafe-eval'");
|
|
28
|
-
directiveDefaults["connect-src"].push("ws:");
|
|
29
|
-
}
|
|
30
|
-
const directiveNames = Object.keys(directiveDefaults);
|
|
31
|
-
for (let i = 0; i < directiveNames?.length; i += 1) {
|
|
32
|
-
const directive = directiveNames[i];
|
|
33
|
-
directiveDefaults[directive] = [
|
|
34
|
-
...directiveDefaults[directive] || [],
|
|
35
|
-
...unrestrictedOrigins || [],
|
|
36
|
-
...directives[directive] || []
|
|
37
|
-
];
|
|
38
|
-
}
|
|
39
|
-
const csp = Object.keys(directiveDefaults).map((source) => {
|
|
40
|
-
return `${source} ${directiveDefaults[source].join(" ")}`;
|
|
41
|
-
})?.join("; ");
|
|
42
|
-
res.setHeader("Content-Security-Policy", csp);
|
|
43
|
-
}
|
|
44
|
-
next();
|
|
45
|
-
};
|
|
46
|
-
export {
|
|
47
|
-
csp_default as default
|
|
48
|
-
};
|
|
1
|
+
import n from"../../lib/types.js";const o=(a,l,i,s=null)=>{if(s&&n.is_object(s)){const e={"base-uri":["'self'"],"child-src":["'self'"],"connect-src":["'self'","wss:"],"default-src":["'self'"],"font-src":["'self'"],"form-action":["'self'"],"frame-src":["'self'"],"img-src":["'self'"],"manifest-src":["'self'"],"media-src":["'self'"],"navigate-to":["'self'"],"object-src":["'self'"],"script-src":["'self'"],"script-src-attr":["'self'"],"script-src-elem":["'self'"],"style-src":["'self'"],"style-src-attr":["'self'"],"style-src-elem":["'self'"],"worker-src":["'self'"]};process.env.NODE_ENV==="development"&&(e["script-src"].push("'unsafe-eval'"),e["connect-src"].push("ws:"));const c=Object.keys(e||{});for(let r=0;r<c?.length;r+=1){const t=c[r];e[t]=[...e[t]||[],...s?.unrestrictedOrigins||s?.unrestricted_origins||[],...s?.directives&&s?.directives[t]||[]]}const f=Object.keys(e||{}).map(r=>`${r} ${e[r].join(" ")}`)?.join("; ");l.setHeader("Content-Security-Policy",f)}i()};var m=o;export{m as default};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const t=(i="",n="")=>{const e=`https://${i}${n}`;return`
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>Insecure Connection</title>
|
|
5
|
+
<style type="text/css">
|
|
6
|
+
body {
|
|
7
|
+
font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
|
|
8
|
+
font-size: 16px;
|
|
9
|
+
line-height: 24px;
|
|
10
|
+
background: #fafafa;
|
|
11
|
+
display: flex;
|
|
12
|
+
margin: 0;
|
|
13
|
+
padding: 20px;
|
|
14
|
+
justify-content: center;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.warning {
|
|
18
|
+
width: 100%;
|
|
19
|
+
max-width: 500px;
|
|
20
|
+
background: #fff;
|
|
21
|
+
border: 1px solid #eee;
|
|
22
|
+
border-radius: 3px;
|
|
23
|
+
padding: 35px;
|
|
24
|
+
align-self: flex-start;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.warning h1 {
|
|
28
|
+
color: #000;
|
|
29
|
+
font-size: 22px;
|
|
30
|
+
line-height: 30px;
|
|
31
|
+
margin: 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.warning p {
|
|
35
|
+
font-size: 16px;
|
|
36
|
+
line-height: 25px;
|
|
37
|
+
font-weight: 400;
|
|
38
|
+
color: #555;
|
|
39
|
+
margin: 10px 0 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.warning p a {
|
|
43
|
+
color: #555;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@media screen and (min-width: 768px) {
|
|
47
|
+
body {
|
|
48
|
+
padding: 40px;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
</style>
|
|
52
|
+
</head>
|
|
53
|
+
<body>
|
|
54
|
+
<div class="warning">
|
|
55
|
+
<h1>Insecure Connection<h1>
|
|
56
|
+
<p>The site at this URL requires an SSL-secured connection. Please visit <a href="${e}">${e}</a> instead. You will be automatically redirected in 15 seconds.</p>
|
|
57
|
+
</div>
|
|
58
|
+
<script>
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
location.href = '${e}';
|
|
61
|
+
}, 15 * 1000);
|
|
62
|
+
</script>
|
|
63
|
+
</body>
|
|
64
|
+
</html>
|
|
65
|
+
`};var a=t;export{a as default};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
const d=(e="build")=>({build:"Build Error",layout_not_found:"Layout Not Found",page_not_found:"Page Not Found"})[e],t=({type:e="build",path:a,frame:r,stack:o})=>{const i=d(e);return`
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>${i}</title>
|
|
5
|
+
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/styles/atom-one-dark.min.css" />
|
|
6
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/highlight.min.js"></script>
|
|
7
|
+
<style>
|
|
8
|
+
body {
|
|
9
|
+
background: #fff;
|
|
10
|
+
font-size: 16px;
|
|
11
|
+
line-height: 24px;
|
|
12
|
+
color: #333;
|
|
13
|
+
font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
* {
|
|
17
|
+
margin: 0;
|
|
18
|
+
padding: 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
*, *:before, *:after {
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.container {
|
|
26
|
+
width: 90%;
|
|
27
|
+
margin: 0 auto;
|
|
28
|
+
max-width: 1200px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
h1,
|
|
32
|
+
h2,
|
|
33
|
+
h3,
|
|
34
|
+
h4,
|
|
35
|
+
h5,
|
|
36
|
+
h6 {
|
|
37
|
+
margin: 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.container > header {
|
|
41
|
+
padding: 30px 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.container > header h1 {
|
|
45
|
+
font-size: 24px;
|
|
46
|
+
font-weight: bold;
|
|
47
|
+
color: #333;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.container > header h1 .fa-exclamation-triangle {
|
|
51
|
+
color: #ffcc00;
|
|
52
|
+
margin-right: 5px;
|
|
53
|
+
font-size: 22px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.container > header h4 {
|
|
57
|
+
font-size: 18px;
|
|
58
|
+
font-weight: normal;
|
|
59
|
+
color: #888;
|
|
60
|
+
margin-top: 10px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.container > header p {
|
|
64
|
+
margin: 20px 0 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.code-block {
|
|
68
|
+
margin-bottom: 40px;
|
|
69
|
+
border: 1px solid #eee;
|
|
70
|
+
border-radius: 3px;
|
|
71
|
+
background: #282c34;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.code-block header {
|
|
75
|
+
background: #22252b;
|
|
76
|
+
padding: 20px;
|
|
77
|
+
border-radius: 3px 3px 0px 0px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.code-block header .fas {
|
|
81
|
+
color: #aaa;
|
|
82
|
+
margin-right: 5px;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.code-block header h4 {
|
|
86
|
+
color: #fff;
|
|
87
|
+
font-weight: normal;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.code-block pre {
|
|
91
|
+
background: #fff;
|
|
92
|
+
overflow: scroll;
|
|
93
|
+
margin: 0px;
|
|
94
|
+
border-radius: 0px 0px 3px 3px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.code-block pre code.hljs {
|
|
98
|
+
padding: 15px 20px 20px !important;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@media screen and (min-width: 768px) {
|
|
102
|
+
.container {
|
|
103
|
+
max-width: 728px;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.container > header {
|
|
107
|
+
padding: 50px 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.container > header p {
|
|
111
|
+
margin: 30px 0 0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@media screen and (min-width: 1240px) {
|
|
116
|
+
.container {
|
|
117
|
+
max-width: 1200px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
width: 100%;
|
|
121
|
+
}
|
|
122
|
+
</style>
|
|
123
|
+
</head>
|
|
124
|
+
<body>
|
|
125
|
+
<div class="container">
|
|
126
|
+
<header>
|
|
127
|
+
<h1>${i}</h1>
|
|
128
|
+
<h4>${e==="build"?"in":"at"} ${a}</h4>
|
|
129
|
+
${e==="build"?"<p><strong>Your app is failing to build</strong>. Review the output below, correct the issue displayed, and then refresh the page:</p>":""}
|
|
130
|
+
</header>
|
|
131
|
+
${r?`<div class="code-block">
|
|
132
|
+
<header>
|
|
133
|
+
<h4>Code Frame</h4>
|
|
134
|
+
</header>
|
|
135
|
+
<pre><code>${r}</code></pre>
|
|
136
|
+
</div>`:""}
|
|
137
|
+
${o?`<div class="code-block">
|
|
138
|
+
<header>
|
|
139
|
+
<h4>Stack Trace</h4>
|
|
140
|
+
</header>
|
|
141
|
+
<pre><code class="${e!=="build"?"language-plaintext":""}">${o}</code></pre>
|
|
142
|
+
</div>`:""}
|
|
143
|
+
</div>
|
|
144
|
+
<script>hljs.highlightAll();</script>
|
|
145
|
+
</body>
|
|
146
|
+
</html>
|
|
147
|
+
`};var n=t;export{n as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"fs";import r from"../../lib/node_path_polyfills.js";const{readFile:o}=e.promises,i=await o(`${r?.__package}/app/browser/hmr_client.js`,"utf-8"),p=(s,t)=>{t.set("Content-Type","text/javascript"),t.send(i)};var _=p;export{_ as default};
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const forwardedProtocol = req.get("x-forwarded-proto");
|
|
3
|
-
const isForwardedFromHTTPS = forwardedProtocol && forwardedProtocol === "https";
|
|
4
|
-
if (process.env.NODE_ENV != "development" && !req.secure && !isForwardedFromHTTPS) {
|
|
5
|
-
return res.redirect("https://" + req.headers.host + req.url);
|
|
6
|
-
}
|
|
7
|
-
next();
|
|
8
|
-
};
|
|
9
|
-
export {
|
|
10
|
-
insecure_default as default
|
|
11
|
-
};
|
|
1
|
+
import t from"./generate_insecure_page.js";const n=(e,r,s)=>{if(!e.secure)return r.send(t(e?.headers?.host,e?.url));s()};var a=n;export{a as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import o from"fs";import p from"../../lib/node_path_polyfills.js";const{readFile:s}=o.promises,r=await s(`${p.__package}/app/browser/process_polyfill.js`,"utf-8"),l=(t,e)=>{e.set("Content-Type","text/javascript"),e.send(r?.replace("${NODE_ENV}",process.env.NODE_ENV))};var _=l;export{_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import a from"../../../lib/escape_html.js";import p from"../../../lib/escape_key_value_pair.js";const o=(r={})=>{const[t=null]=r.url?.split("?");return{params:p(r.params),query:p(r.query),route:a(r.route.path),path:a(t)}};var m=o;export{m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import w from"fs";import p from"../../../lib/dynamic_import.js";import c from"../generate_joystick_error_page.js";import k from"../../../lib/get_joystick_build_path.js";import j from"../../../lib/get_translations.js";import x from"./get_url.js";import _ from"../../../lib/path_exists.js";import v from"../../ssr/index.js";import"../../../lib/get_browser_safe_request.js";const{readFile:z}=w.promises,i=k(),A=()=>z("index.html","utf-8"),D=(s,e,f,d={})=>{e.render=async(n="",t={})=>{const u=n?.substring(0,1)==="/"?n?.replace("/",""):n,r=t?.layout?.substring(0,1)==="/"?t?.layout?.replace("/",""):t?.layout,a=`${i}${u}`,o=t?.layout?`${i}${r}`:null;if(!await _(a))return e.status(404).send(c({type:"page_not_found",path:`res.render('${a}')`,frame:null,stack:`A page component at the path ${a} could not be found.`}));if(o&&!await _(o))return e.status(404).send(c({type:"layout_not_found",path:`res.render('${a}', { layout: '${r}' })`,frame:null,stack:`A layout component at the path ${t?.layout} could not be found.`}));const l=await p(`${a}?v=${new Date().getTime()}`),h=o?await p(`${o}?v=${new Date().getTime()}`):null,m={...t?.props||{}};o&&(m.page=l);const y=await A(),g=await j({joystick_build_path:i,render_component_path:n,req:s}),$=x(s),b=await v({api_schema:d?.options?.api,attributes:t?.attributes,base_html:y,component_options:{props:m,translations:g,url:$},component_to_render:h||l,head:t?.head,render_component_path:u,render_layout_path:r,req:s});return e.status(200).send(b)},f()};var K=D;export{K as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const o=(e,d,t)=>{["OPTIONS","HEAD","CONNECT","GET","POST","PUT","DELETE","PATCH"].includes(e.method)||d.status(405).send(`${e.method} not allowed.`),t()};var l=o;export{l as default};
|
|
@@ -1,24 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import generateId from "../../lib/generateId.js";
|
|
3
|
-
var session_default = (req, res, next, appInstance = {}) => {
|
|
4
|
-
let sessionId = req?.cookies?.joystickSession;
|
|
5
|
-
if (!sessionId) {
|
|
6
|
-
sessionId = generateId(32);
|
|
7
|
-
setCookie(res, "joystickSession", sessionId);
|
|
8
|
-
}
|
|
9
|
-
if (!appInstance.sessions.get(sessionId)) {
|
|
10
|
-
appInstance.sessions.set(sessionId, { id: sessionId, csrf: generateId(32) });
|
|
11
|
-
}
|
|
12
|
-
req.cookies = {
|
|
13
|
-
...req?.cookies || {},
|
|
14
|
-
joystickSession: sessionId
|
|
15
|
-
};
|
|
16
|
-
req.context = {
|
|
17
|
-
...req?.context || {},
|
|
18
|
-
session: appInstance?.sessions?.get(sessionId)
|
|
19
|
-
};
|
|
20
|
-
next();
|
|
21
|
-
};
|
|
22
|
-
export {
|
|
23
|
-
session_default as default
|
|
24
|
-
};
|
|
1
|
+
import i from"../databases/queries/sessions.js";import n from"../../lib/set_cookie.js";const c=async(o,e,t)=>{let s=o?.cookies?.joystick_session;(s?await i("get_session",{session_id:s}):null)||(s=await i("create_session"),n(e,"joystick_session",s)),o.cookies={...o?.cookies||{},joystick_session:s},o.context={...o?.context||{},session:await i("get_session",{session_id:s})},t()};var l=c;export{l as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import t from"winston";import s from"fs";import e from"../lib/path_exists.js";const{mkdir:i}=s.promises,n=async()=>{await e("/root/push/logs")||await i("/root/push/logs",{recursive:!0});const r=t.createLogger({format:t.format.combine(t.format.timestamp(),t.format.json()),transports:[new t.transports.File({filename:"/root/push/logs/app.log",maxsize:1024*1024*20,maxFiles:1,tailable:!0})]});process.stdout.write=o=>{r.info(o)},process.stderr.write=o=>{r.error(o)},process.on("uncaughtException",o=>{r.error(o instanceof Error?o?.toString():o)}),process.on("unhandledRejection",o=>{r.error(o instanceof Error?o?.toString():o)})};var c=n;export{c as default};
|
package/dist/app/queues/index.js
CHANGED
|
@@ -1,119 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import os from "os";
|
|
4
|
-
import generateId from "../../lib/generateId";
|
|
5
|
-
import getTargetDatabaseProvider from "../databases/getTargetDatabaseProvider";
|
|
6
|
-
import queryMap from "../databases/queryMap";
|
|
7
|
-
class Queue {
|
|
8
|
-
constructor(queueName = "", queueOptions = {}) {
|
|
9
|
-
this.machineId = fs.readFileSync(`${os.homedir()}/.cheatcode/MACHINE_ID`, "utf-8")?.trim().replace(/\n/g, "");
|
|
10
|
-
this.name = queueName;
|
|
11
|
-
this.options = {
|
|
12
|
-
concurrentJobs: 1,
|
|
13
|
-
...queueOptions
|
|
14
|
-
};
|
|
15
|
-
this._initDatabase();
|
|
16
|
-
if (queueOptions?.runOnStartup) {
|
|
17
|
-
this.run();
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
async _initDatabase() {
|
|
21
|
-
const queuesDatabase = getTargetDatabaseProvider("queues");
|
|
22
|
-
const db = queryMap[queuesDatabase]?.queues;
|
|
23
|
-
if (db && typeof db === "object" && !Array.isArray(db)) {
|
|
24
|
-
this.db = Object.entries(db)?.reduce((boundQueries = {}, [queryFunctionName, queryFunction]) => {
|
|
25
|
-
boundQueries[queryFunctionName] = queryFunction.bind({
|
|
26
|
-
machineId: this.machineId,
|
|
27
|
-
queue: {
|
|
28
|
-
name: this.name,
|
|
29
|
-
options: this.options
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
return boundQueries;
|
|
33
|
-
}, {});
|
|
34
|
-
await this.db.initializeDatabase();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
add(options = {}) {
|
|
38
|
-
const nextRunAt2 = options?.nextRunAt === "now" || !options?.nextRunAt ? dayjs().format() : options?.nextRunAt;
|
|
39
|
-
this.db.addJob({
|
|
40
|
-
_id: generateId(),
|
|
41
|
-
status: "pending",
|
|
42
|
-
...options,
|
|
43
|
-
nextRunAt: nextRunAt2
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
async _checkIfOkayToRunJobs() {
|
|
47
|
-
const jobsRunning = await this._getNumberOfJobsRunning();
|
|
48
|
-
return jobsRunning < this.options.concurrentJobs;
|
|
49
|
-
}
|
|
50
|
-
_getNumberOfJobsRunning() {
|
|
51
|
-
return this.db.countJobs("running");
|
|
52
|
-
}
|
|
53
|
-
_handleRequeueJobsRunningBeforeRestart() {
|
|
54
|
-
if (!this.db) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
if (!this.options.retryJobsRunningBeforeRestart) {
|
|
58
|
-
return this.db.setJobsForMachineIncomplete();
|
|
59
|
-
}
|
|
60
|
-
return this.db.setJobsForMachinePending();
|
|
61
|
-
}
|
|
62
|
-
run() {
|
|
63
|
-
if (!this.db) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
console.log(`Starting ${this.name} queue...`);
|
|
67
|
-
this._handleRequeueJobsRunningBeforeRestart().then(() => {
|
|
68
|
-
setInterval(async () => {
|
|
69
|
-
const okayToRunJobs = await this._checkIfOkayToRunJobs();
|
|
70
|
-
if (okayToRunJobs && !process.env.HALT_QUEUES) {
|
|
71
|
-
const nextJob = await this.db.getNextJobToRun();
|
|
72
|
-
this._handleNextJob(nextJob);
|
|
73
|
-
}
|
|
74
|
-
}, 300);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
_handleNextJob(nextJob = {}) {
|
|
78
|
-
if (nextJob && nextJob?.job && this.options.jobs[nextJob?.job] && typeof this.options.jobs[nextJob?.job]?.run === "function") {
|
|
79
|
-
try {
|
|
80
|
-
this.options.jobs[nextJob.job].run(nextJob?.payload, {
|
|
81
|
-
...nextJob,
|
|
82
|
-
queue: this,
|
|
83
|
-
completed: () => this._handleJobCompleted(nextJob?._id),
|
|
84
|
-
failed: (error) => this._handleJobFailed(nextJob?._id, error),
|
|
85
|
-
delete: () => this._handleDeleteJob(nextJob?._id),
|
|
86
|
-
requeue: (nextRunAt2 = "") => this._handleRequeueJob(nextJob, nextRunAt2)
|
|
87
|
-
});
|
|
88
|
-
} catch (exception) {
|
|
89
|
-
this._handleJobFailed(nextJob?._id, exception);
|
|
90
|
-
if (this.options.jobs[nextJob.job]?.requeueOnFailure) {
|
|
91
|
-
this._handleRequeueJob(nextRunAt, dayjs().add(10, "seconds").format());
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
_handleJobCompleted(jobId = "") {
|
|
97
|
-
return this.db.setJobCompleted(jobId);
|
|
98
|
-
}
|
|
99
|
-
_handleJobFailed(jobId = "", error = "") {
|
|
100
|
-
return this.db.setJobFailed(jobId, error);
|
|
101
|
-
}
|
|
102
|
-
_handleDeleteJob(jobId = "") {
|
|
103
|
-
return this.db.deleteJob(jobId);
|
|
104
|
-
}
|
|
105
|
-
_handleRequeueJob(job = {}, nextRunAt2 = dayjs().format()) {
|
|
106
|
-
return this.db.requeueJob(job?._id, nextRunAt2);
|
|
107
|
-
}
|
|
108
|
-
list(status = "") {
|
|
109
|
-
const query = {};
|
|
110
|
-
if (status) {
|
|
111
|
-
query.status = status;
|
|
112
|
-
}
|
|
113
|
-
return this.db.getJobs(query);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
var queues_default = Queue;
|
|
117
|
-
export {
|
|
118
|
-
queues_default as default
|
|
119
|
-
};
|
|
1
|
+
import d from"chalk";import h from"fs";import c from"os";import b from"../../lib/generate_id.js";import f from"../databases/get_target_database_connection.js";import l from"../databases/queries/map.js";import _ from"../../lib/timestamps.js";import i from"../../lib/types.js";import p from"../../test/track_function_call.js";class m{constructor(e="",t={}){this.init_database=this.init_database.bind(this),this.machine_id=h.readFileSync(`${c.homedir()}/.cheatcode/MACHINE_ID`,"utf-8")?.trim().replace(/\n/g,""),this.name=e,this.options={concurrent_jobs:1,...t},this.init_database(this?.options?.external,this?.options?.database?.provider)}async init_database(e=!1,t=null){const n=t||f("queues")?.provider,s=l[n]?.queues,o=this._get_database_connection();i.is_object(o)&&i.is_object(s)&&(this.db=Object.entries(s||{})?.reduce((a={},[r,u])=>(a[r]=u.bind({db:o,machine_id:this.machine_id,queue:{name:this.name,options:this.options}}),a),{_connection:o}),e||(await this.db.initialize_database(n),(this?.options?.runOnStartup||this?.options?.run_on_startup)&&this.run()))}_get_database_connection(){if(this?.options?.database){const{provider:e,name:t}=this?.options?.database,n=process.databases&&process.databases[e]&&process.databases[e][t];return n||console.warn(d.red(`Connection to database ${e}.${t} not found on process. Cannot start queue.`)),n||null}return process.databases._queues}async add(e={}){const t=(e?.nextRunAt||e?.next_run_at)==="now"||!e?.nextRunAt&&!e?.next_run_at?_.get_future_time():e?.nextRunAt||e?.next_run_at,n={_id:b(16),status:"pending",environment:process.env.NODE_ENV,next_run_at:t,job:e?.job,payload:e?.payload},s=this?.options?.jobs&&this?.options?.jobs[e?.job];if(s&&(i.is_function(s?.preflight?.onBeforeAdd)||i.is_function(s?.preflight?.on_before_add))&&!await(s?.preflight?.onBeforeAdd||s?.preflight?.on_before_add)(n,this.db._connection,`queue_${this.name}`))return null;this.db.add_job(n)}async _check_if_okay_to_run_jobs(){return await this._get_number_of_jobs_running()<(this.options.concurrentJobs||this.options.concurrent_jobs||1)}_get_number_of_jobs_running(){return this.db.count_jobs("running")}_handle_requeue_jobs_running_before_restart(){if(this.db)return!this.options.retryJobsRunningBeforeRestart&&!this.options.retry_jobs_running_before_restart?this.db.delete_incomplete_jobs_for_machine():this.db.set_jobs_for_machine_pending()}run(){this.db&&(process.env.NODE_ENV!=="test"&&console.log(`Starting ${this.name} queue...`),this._handle_requeue_jobs_running_before_restart().then(()=>{setInterval(async()=>{if(await this._check_if_okay_to_run_jobs()&&!process.env.HALT_QUEUES){const t=await this.db.get_next_job_to_run();this.handle_next_job(t)}},300)}))}async handle_next_job(e={}){const t=this.options.jobs[e?.job];if(e&&e?.job&&t&&i.is_function(t?.run))try{if((i.is_function(t?.preflight?.okayToRun)||i.is_function(t?.preflight?.okay_to_run))&&!await(t?.preflight?.okayToRun||t?.preflight?.okay_to_run)(e?.payload,e))return this._handle_requeue_job(e,_.get_future_time("seconds",t?.preflight?.requeueDelayInSeconds||t?.preflight?.requeue_delay_in_seconds||10));if((i.is_number(t?.maxAttempts)||i.is_number(t?.max_attempts))&&e?.attempts>=parseInt(t?.maxAttempts||t?.max_attempts,10))return(i.is_function(t?.onMaxAttemptsExhausted)||i.is_function(t?.on_max_attempts_exhausted))&&await(t.onMaxAttemptsExhausted||t.on_max_attempts_exhausted)(e),this._handle_delete_job(e?._id);await this._log_attempt(e?._id),p(`node.queues.${this?.name}.jobs.${e?.job}`,[e?.payload]),await t.run(e?.payload,{...e,queue:this,completed:()=>this._handle_job_completed(e?._id),failed:n=>this._handle_job_failed(e,t,n),delete:()=>this._handle_delete_job(e?._id),requeue:(n="")=>this._handle_requeue_job(e,n)})}catch(n){console.warn(n),this._handle_job_failed(e,t,n)}}_log_attempt(e=""){return this.db.log_attempt(e)}_handle_job_completed(e=""){return this.db.set_job_completed(e)}_handle_job_failed(e={},t={},n=""){return t?.requeueOnFailure||t?.requeue_on_failure?this._handle_requeue_job(e,_.get_future_time("seconds",10)):this.db.set_job_failed(e?._id,n)}_handle_delete_job(e=""){return this.db.delete_job(e)}_handle_requeue_job(e={},t=null){return this.db.requeue_job(e?._id,t||_.get_future_time())}list(e=""){const t={};return e&&(t.status=e),this.db.get_jobs(t)}}var R=m;export{R as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=(o={},s={})=>{o.databases=[],o.express={},o.options=s};var t=e;export{t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const c=(t={},e="",n=null)=>{t.get(e,async(o,r,u)=>{n(o,r,u)})};var f=c;export{f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import s from"./supported_http_methods.js";import i from"../../lib/types.js";const p=(d={},t="",o={})=>{const n=o?.method?.toLowerCase(),m=o?.methods?.map(e=>e?.toLowerCase()),r=(n?[n]:m)?.filter(e=>s.includes(e)),f=i.is_array(o?.middleware)?o?.middleware:[];if(r?.length===0){console.warn(`Cannot register route ${t}. All provided HTTP methods are invalid. Must be one of ${s?.join(", ")}.`);return}if(!i.is_function(o?.handler)){console.warn(`Cannot register route ${t}. Handler must be a function.`);return}for(let e=0;e<r?.length;e+=1){const a=r[e];d[a](t,...f||[],async(c,l,u)=>{o.handler(c,l,u)})}};var _=p;export{_ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t=["get","delete","patch","post","put"];var e=t;export{e as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import o from"../../lib/is_valid_json.js";import r from"../../lib/parse_json.js";const s={config:{},global:{},public:{},private:{}},i=()=>{const t=!!process.env.JOYSTICK_SETTINGS,e=`${process.env.JOYSTICK_SETTINGS}`.replace(/\\/g,""),n=t&&o(e);return t?n?r(e)||s:(console.warn(`Could not parse settings. Please verify that your settings.${process.env.NODE_ENV}.json file exports a valid JSON object.`),s):s};var p=i;export{p as default};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import u from"fs";import{parseHTML as p}from"linkedom";import y from"os";import $ from"../api/get_api_for_data_functions.js";import f from"../../lib/get_browser_safe_request.js";import h from"../settings/load.js";import w from"./set_base_attributes_in_html.js";import b from"./set_head_tags_in_html.js";import i from"../../lib/path_exists.js";import g from"../accounts/get_browser_safe_user.js";const{readFile:a}=u.promises,_=h(),s=process.env.NODE_ENV==="development",{document:j}=p("<div></div>"),k=(e={})=>e?.base_html.replace("${css}",`<style type="text/css" js-css>${e?.css}</style>`).replace('<div id="app"></div>',`
|
|
2
|
+
<div id="app">${e?.html}</div>
|
|
3
|
+
<script>
|
|
4
|
+
window.joystick = {
|
|
5
|
+
settings: {
|
|
6
|
+
global: ${JSON.stringify(_?.global)},
|
|
7
|
+
public: ${JSON.stringify(_?.public)},
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
window.__joystick_platform__ = '${y.platform()}';
|
|
12
|
+
window.__joystick_data__ = '${Buffer.from(JSON.stringify(e?.data),"utf8").toString("base64")}';
|
|
13
|
+
window.__joystick_i18n__ = ${JSON.stringify(e?.translations)};
|
|
14
|
+
${s?`window.__joystick_hmr_port__ = ${parseInt(process.env.PORT,10)+1}`:""}
|
|
15
|
+
window.__joystick_layout_url__ = ${e?.render_layout_path?`"/_joystick/${e?.render_layout_path}"`:null};
|
|
16
|
+
window.__joystick_page_url__ = ${e?.render_component_path?`"/_joystick/${e?.render_component_path}"`:null};
|
|
17
|
+
window.__joystick_request__ = ${JSON.stringify(f(e?.req))};
|
|
18
|
+
window.__joystick_settings__ = ${JSON.stringify({global:_?.global,public:_?.public})};
|
|
19
|
+
|
|
20
|
+
window.__joystick_should_auto_mount__ = true;
|
|
21
|
+
window.__joystick_ssr_props__ = ${JSON.stringify(e?.props)};
|
|
22
|
+
window.__joystick_url__ = ${JSON.stringify(e?.url)};
|
|
23
|
+
window.__joystick_user__ = ${JSON.stringify(g(e?.req?.context?.user))};
|
|
24
|
+
</script>
|
|
25
|
+
<script type="module" src="/_joystick/utils/process.js"></script>
|
|
26
|
+
<script type="module" src="/_joystick/index.client.js"></script>
|
|
27
|
+
${e?.render_component_path?`<script type="module" src="/_joystick/${e?.render_component_path}"></script>`:""}
|
|
28
|
+
${e?.render_layout_path?`<script type="module" src="/_joystick/${e?.render_layout_path}"></script>`:""}
|
|
29
|
+
${s?'<script type="module" src="/_joystick/hmr/client.js"></script>':""}
|
|
30
|
+
`),v=(e={})=>e?.base_html.replace("${css}",`<style type="text/css">${e?.css}</style>`).replace("${subject}",e?.email_options?.subject).replace("${preheader}",e?.email_options?.preheader||"").replace('<div id="email"></div>',`<div id="email">${e?.html}</div>`),N=(e={})=>e?.is_email?v(e):k(e),O=async(e="")=>await i(`email/${e?`base_${e}`:"base"}.html`)?a(`email/${e?`base_${e}`:"base"}.html`,"utf-8"):(console.warn(`Could not find email/${e?`base_${e}`:"base"}.html`),""),S=async(e="")=>await i(`email/${e?`base_${e}`:"base"}.css`)?a(`email/${e?`base_${e}`:"base"}.css`,"utf-8"):(console.warn(`Could not find email/${e?`base_${e}`:"base"}.css`),""),q=(e=null,t={})=>e(t),J=async(e={})=>{const t=q(e?.component_to_render,e?.component_options),c=$(e?.req,e?.api_schema),l=[],r=await t.render_for_ssr(c,e?.req,l,{linkedom_document:j,is_email:e?.is_email}),n=e?.is_email?await S(e?.email_options?.base_html_name):null,o=e?.is_email?await O(e?.email_options?.base_html_name):null,m=N({is_email:e?.is_email,attributes:e?.attributes,base_html:e?.is_email?o:e?.base_html,component_instance:t,css:e?.is_email?`
|
|
31
|
+
${n}
|
|
32
|
+
${r?.css}
|
|
33
|
+
`:r?.css,data:r?.data,email_options:e?.email_options,head:e?.head,html:r?.html,props:e?.component_options?.props,render_component_path:e?.render_component_path,render_layout_path:e?.render_layout_path,req:e?.req,translations:e?.component_options?.translations,url:e?.component_options?.url}),d=b(m,e?.head,e?.req);return w(d,e?.attributes)};var P=J;export{P as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{parseHTML as n}from"linkedom";import a from"../../lib/types.js";const i=(e={},s={})=>{const c=Object.keys(s||{})?.filter(t=>t!=="class");if(a.is_array(s?.class?.list))if(s?.class?.method==="replace")e.setAttribute("class",s.class.list.join(" "));else for(let t=0;t<s.class.list.length;t+=1){const o=s.class.list[t];e.classList.add(o)}for(let t=0;t<c.length;t+=1){const o=c[t];e.setAttribute(o,s[o])}return e},r=(e="",s={})=>{const{document:l}=n(e);return s?.html&&i(l.documentElement,s.html),s?.body&&i(l.body,s.body),l.toString()};var m=r;export{m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import c from"node-html-parser";import _ from"../../lib/types.js";const f=(u="",t=null,p={})=>{const g=c.parse(u),i=g.querySelector("head");if(p?.context?.session){const s=c.parse("<meta />").querySelector("meta");s.setAttribute("name","csrf"),s.setAttribute("content",p?.context?.session?.csrf),i.appendChild(s)}if(!t)return g.toString();if(t.title){const e=i.querySelector("title");if(e){const s=c.parse(`<title>${t.title}</title>`);i.exchangeChild(e,s)}e||i.insertAdjacentHTML("afterbegin",`<title>${t.title}</title>`)}if(t.tags&&t.tags.meta&&_.is_array(t.tags.meta)&&t.tags.meta.length>0)for(let e=0;e<t?.tags?.meta?.length;e+=1){const s=t.tags.meta[e],r=i.querySelector(`meta[name="${s.name}"]`),a=c.parse("<meta />"),n=Object.entries(s||{});for(let l=0;l<n?.length;l+=1){const[o,m]=n[l];a.querySelector("meta").setAttribute(o,m)}r&&i.exchangeChild(r,a),r||i.appendChild(a)}if(t.tags&&t.tags.link&&_.is_array(t.tags.link)&&t.tags.link.length>0)for(let e=0;e<t?.tags?.link?.length;e+=1){const s=t?.tags?.link[e],r=c.parse("<link />"),a=Object.entries(s||{});for(let n=0;n<a?.length;n+=1){const[l,o]=a[n];r.querySelector("link").setAttribute(l,o)}i.appendChild(r)}if(t.tags&&t.tags.script&&Array.isArray(t.tags.script)&&t.tags.script.length>0)for(let e=0;e<t?.tags?.script?.length;e+=1){const s=t.tags.script[e],r=c.parse("<script></script>"),a=Object.entries(s||{});for(let n=0;n<a?.length;n+=1){const[l,o]=a[n];r.querySelector("script").setAttribute(l,o)}i.appendChild(r)}if(t.jsonld){const e=c.parse("<script></script>"),s=e.querySelector("script");s.setAttribute("type","application/ld+json"),s.set_content(JSON.stringify(t.jsonld,null,2)),i.appendChild(e)}return g.toString()};var S=f;export{S as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import f from"express";import u from"https";import g from"./middleware/built_in.js";import w from"../lib/get_joystick_build_path.js";import _ from"./get_ssl_certificates.js";import m from"../lib/types.js";const y=(r=null,o={})=>{const n=joystick?.settings?.config||{},c=w(),i=_(o?.options?.ssl),s=process.env.PORT?parseInt(process.env.PORT,10):2600;process.env.PORT=s;const t=f(),d=i?u.createServer(i,t).listen(s):t.listen(s);if(g({app_instance:o,csp_config:o?.options?.csp,express_app:t,joystick_build_path:c,middleware_config:n?.middleware,port:s}),o?.options?.middleware&&m.is_array(o?.options?.middleware))for(let e=0;e<o?.options?.middleware?.length;e+=1){const p=o?.options?.middleware[e];t.use(p)}const l={port:s,app:t,server:d};return m.is_function(r)&&r(l,o),l};var k=y;export{k as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import o from"cluster";import c from"os";const i=(n=null)=>{const t=c.cpus().length;if(o.isPrimary){for(let s=0;s<t;s++){const r=o.fork();r.on("message",e=>{process.send&&process.send(e)}),process.on("message",e=>{r.send(e)})}o.on("exit",s=>{console.warn(`Worker ${s.process.pid} died.`)})}else n()};var d=i;export{d as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import p from"../websockets/emit_event.js";import d from"../../lib/float_to_decimal_place.js";const i=(r=1,e={},n={},s)=>{let o=0;const l=parseInt(e.headers["content-length"],10);e.on("data",t=>{if(t.length>0){o+=t.length;const a=d(o/(l*r)*100);p(`uploaders_${e?.headers["x-joystick-upload-id"]}`,"progress",{provider:"local",progress:a})}}),s()};var g=i;export{g as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import h from"multer";import m from"../../lib/get_browser_safe_request.js";import p from"../api/handle_api_error.js";import v from"../../lib/is_valid_json.js";import w from"./local_upload_progress_middleware.js";import y from"./run_upload.js";import q from"../../lib/string_to_slug.js";import g from"../../test/track_function_call.js";import d from"../../lib/types.js";import x from"./validate_options.js";import $ from"./validate_uploads.js";const z=async(e={})=>{const r=parseInt(e?.req?.headers["content-length"],10),t=e?.uploader_options?.providers?.includes("local")?e?.uploader_options?.providers.length:e?.uploader_options?.providers?.length+1,s=r*t;return y({existing_upload_progress:r,total_upload_size_all_providers:s,uploads:e?.validated_uploads,input:e?.upload_input,req:e?.req})},B=async(e="",r=null,t={})=>{await r({input:t?.input,req:t?.req,uploads:t?.uploads}),g(`node.uploaders.${e}.on_after_upload`,[{input:t?.input,req:m(t?.req),uploads:t?.uploads}])},M=async(e="",r=null,t={})=>{await r({input:t?.input,req:t?.req,uploads:t?.uploads}),g(`node.uploaders.${e}.on_before_upload`,[{input:t?.input,req:m(t?.req),uploads:t?.uploads}])},S=(e="")=>e&&v(e)&&JSON.parse(e),U=async(e="",r={},t={},s={})=>{try{const a=S(t?.headers["x-joystick-upload-input"]),i=await $({files:t?.files,uploader_input:a,uploader_name:e,uploader_options:r});if(i?.errors)return p(`uploaders.${e}`,i,s);(d.is_function(r?.onBeforeUpload)||d.is_function(r?.on_before_upload))&&await M(e,r?.onBeforeUpload||r?.on_before_upload,{input:a,req:t,uploads:i});const l=await z({validated_uploads:i,uploader_input:a,uploader_options:r,req:t});return(d.is_function(r?.onAfterUpload)||d.is_function(r?.on_after_upload))&&await B(e,r?.onAfterUpload||r?.on_after_upload,{input:a,req:t,uploads:l}),s.status(200).send(JSON.stringify({uploads:l}))}catch(a){p(`uploaders.${e}`,a,s)}},b=(e="",r={},t={})=>{const s=q(e),a=r?.maxSizeInMegabytes||r?.max_size_in_megabytes,l=h({limits:{fileSize:`${a||10}MB`}}).array("files",10),_=r?.providers?.includes("local")?r?.providers?.length:r?.providers?.length+1;t.express.app.post(`/api/_uploaders/${s}`,(n,o,u)=>w(_,n,o,u),(n,o,u)=>l(n,o,c=>{if(c){let f=c;c?.message==="File too large"&&(f=new Error(`Max file size is ${a}MB.`)),p(`uploader.${e}`,f,o)}else u()}),(n={},o={})=>U(e,r,n,o))},j=(e=[])=>{if(e?.length>0)for(let r=0;r<e?.length;r+=1){const t=e[r];console.error(t)}},O=(e={},r={})=>{const t=Object.entries(e);for(let s=0;s<t?.length;s+=1){const[a,i]=t[s],l=x(i);j(l),l?.length===0&&b(a,i,r)}};var K=O;export{K as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import c from"fs";import l from"path";import{S3Client as _}from"@aws-sdk/client-s3";import{Upload as f}from"@aws-sdk/lib-storage";import y from"../websockets/emit_event.js";import p from"../../lib/float_to_decimal_place.js";import g from"../../lib/path_exists.js";const{mkdir:h,writeFile:d}=c.promises,w=async(e={},t={},a={})=>new Promise(async(n,r)=>{try{const i=new f({client:new _({region:e?.s3?.region,credentials:{accessKeyId:e?.s3?.accessKeyId||e?.s3?.access_key_id,secretAccessKey:e?.s3?.secretAccessKey||e?.s3?.secret_access_key}}),params:{Bucket:e?.s3?.bucket,Key:e.file_name,Body:e.content,ContentType:e.mime_type},queueSize:4,partSize:5242880});let s=0;i.on("httpUploadProgress",m=>{a("s3",m?.loaded-s),s=m?.loaded});const o=await i.done();return n({id:t?.req?.headers["x-joystick-upload-id"],provider:"s3",url:o?.Location,size:e?.fileSize,file_name:e?.file_name,fileName:e?.file_name,original_file_name:e?.original_file_name,originalFileName:e?.original_file_name,mime_type:e?.mime_type,mimeType:e?.mime_type})}catch(i){r(i?.message||"There was an error uploading your file to Amazon S3. Check the server logs for more information.")}}),k=async(e={},t={})=>{if(e?.local?.path)return new Promise(async(a,n)=>{try{await g(e?.local?.path)||await h(e?.local?.path,{recursive:!0});const r=l.dirname(`${e?.local?.path}/${e?.file_name}`);c.existsSync(r)||c.mkdirSync(r,{recursive:!0});const i=`${e?.local?.path}/${e?.file_name}`||`_uploads/${e?.file_name}`;await d(i,e.content),a({id:t?.req?.headers["x-joystick-upload-id"],provider:"local",url:i,size:e?.file_size,file_name:e?.file_name,fileName:e?.file_name,original_file_name:e?.original_file_name,originalFileName:e?.original_file_name,mime_type:e?.mime_type,mimeType:e?.mime_type})}catch(r){n(r)}})},v=async(e={})=>{const t=[];let a=e?.existing_upload_progress;const n=(r="",i=0)=>{const s=a+i,o=p(s/e?.total_upload_size_all_providers*100);y(`uploaders_${e?.req?.headers["x-joystick-upload-id"]}`,"progress",{provider:r,progress:o}),a+=i};for(let r=0;r<e?.uploads?.length;r+=1){const i=e?.uploads[r];if(i?.providers?.includes("local")){const s=await k(i,e);t.push(s)}if(i?.providers?.includes("s3")){const s=await w(i,e,n);t.push(s)}}return t};var T=v;export{T as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const a=["mimeTypes","mime_types","maxSizeInMegabytes","max_size_in_megabytes","fileName","file_name","providers","local","s3","onBeforeUpload","on_before_upload","onAfterUpload","on_after_upload"],t=["path"],n=["region","accessKeyId","access_key_id","secretAccessKey","secret_access_key","bucket","acl"],r=(e={})=>{const l=[],c=Object.keys(e||{});for(let s=0;s<c?.length;s+=1){const o=c[s];a.includes(o)||l.push(`${o} is not an allowed uploader option.`)}if(e?.providers?.includes("local")&&!e?.local&&l.push("If an uploader provider is 'local', local object must be specified in uploader_options with a storage path."),e?.providers?.includes("s3")&&!e?.s3&&l.push("If an uploader provider is 's3', s3 object must be specified with configuration."),e?.provider?.includes("local")&&e.local){const s=Object.keys(e?.local);for(let o=0;o<s?.length;o+=1){const i=s[o];t.includes(i)||l.push(`local.${i} is not an allowed uploader option.`)}}if(e?.provider?.includes("s3")&&e.s3){const s=Object.keys(e.s3||{});for(let o=0;o<s?.length;o+=1){const i=s[o];n.includes(i)||l.push(`local.${i} is not an allowed uploader option.`)}}return l};var d=r;export{d as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import l from"../../lib/log.js";import o from"../../test/track_function_call.js";import f from"../../lib/types.js";const _=({uploader_name:t,max_size_in_megabytes:s,mime_types:i,original_file_name:m,file_size:e,mime_type:c})=>{const a=s*1024*1024,r=[];if(f.is_number(a)&&e&&e>a){const n=`The file ${m} is too big. Max file size is ${s}MB.`;l(n,{level:"danger",docs:"https://docs.cheatcode.co/joystick/node/uploaders"}),r.push({status:400,error:new Error(n),message:n,location:`uploaders.${t}`})}if(i?.length>0&&!i.includes(c)){const n=`The MIME type for the file ${m} is not supported by the uploader ${t} (only ${i?.join(", ")}).`;l(n,{level:"danger",docs:"https://docs.cheatcode.co/joystick/node/uploaders"}),r.push({status:400,error:new Error(n),message:n,location:`uploaders.${t}`})}return r},g=(t=[])=>t.flatMap((s={})=>_(s)),z=({files:t=[],uploader_name:s="",uploader_options:i={},uploader_input:m={}})=>Promise.all(t.map(async e=>{const c=e?.mimetype?.split("/").pop(),a=f.is_function(i?.fileName)||f.is_function(i?.file_name),r=f.is_function(i?.maxSizeInMegabytes)||f.is_function(i?.max_size_in_megabytes);a&&o(`node.uploaders.${s}.file_name`,[{uploader_input:m,file_name:e?.originalname,file_size:e?.size,file_extension:c,mime_type:e?.mimetype}]),r&&o(`node.uploaders.${s}.max_size_in_megabytes`,[{input:m,upload:e}]);const n=r?await(i?.maxSizeInMegabytes||i?.max_size_in_megabytes)({input:m,upload:e}):i?.maxSizeInMegabytes||i?.max_size_in_megabytes,y=a?(i.fileName||i?.file_name)({input:m,fileName:e?.originalname,file_name:e?.originalname,fileSize:e?.size,file_size:e?.size,fileExtension:c,file_extension:c,mimeType:e?.mimetype,mime_type:e?.mimetype}):e?.originalname;return{uploader_name:s,providers:i?.providers,local:i?.local,s3:i?.s3,maxSizeInMegabytes:n,max_size_in_megabytes:n,mimeTypes:i?.mimeTypes,mime_types:i?.mimeTypes,fileName:y,file_name:y,original_file_name:e?.originalname,originalFileName:e?.originalname,file_size:e?.size,fileSize:e?.size,mime_type:e?.mimetype,mimeType:e?.mimetype,content:e?.buffer}})),h=async(t={})=>{const s=await z(t),i=g(s);return i?.length>0?{errors:i}:s};var $=h;export{$ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import o from"../../lib/types.js";const s=(i="",r="",m={})=>{const t=joystick?.emitters[i];if(o.is_array(t))for(let e=0;e<t?.length;e+=1)t[e].emit(r,m)};var p=s;export{p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import c from"./emit_event.js";import m from"../../test/track_function_call.js";const r=(t="")=>({send:(e={},o="")=>{const s=o?`${t}_${o}`:t;c(s,"message",e),m(`node.websockets.${t}.send`,[e])}});var n=r;export{n as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import h from"events";import S from"query-string";import*as y from"ws";import a from"../../test/track_function_call.js";import l from"../../lib/types.js";const j=(e={},s={})=>{e.on("upgrade",(n,r,o)=>{if(n?.url?.includes("/api/_websockets")){const t=(n?.url?.replace("/api/_websockets/","")?.split("?")||[])[0],p=s[t];p&&p.server.handleUpgrade(n,r,o,O=>{p.server.emit("connection",O,n)})}})},$=(e={},s={},n={})=>{const r=Object.assign(e,{params:s});(l.is_function(n?.onOpen)||l.is_function(n?.on_open))&&(n?.onOpen||n?.on_open)(r),e.on("message",o=>{const t=JSON.parse(o);l.is_function(n?.on_message)&&n?.on_message(t,e)}),e.on("close",(o=0,t="")=>{l.is_function(n?.on_close)&&n?.on_close(o,t?.toString(),e)})},u=(e="",s={},n={})=>{const r=new h,o=s?.id?`${e}_${s?.id}`:e;joystick?.emitters&&joystick?.emitters[o]?joystick.emitters[o].push(r):joystick.emitters={...joystick?.emitters||{},[o]:[r]},r.on("message",(t={})=>{n.send(JSON.stringify(t))}),r.on("progress",(t={})=>{n.send(JSON.stringify({type:"PROGRESS",...t}))})},C=(e={})=>{const[s,n]=e?.url?.split("?");return S.parse(n)},E=(e="",s={})=>{s?.server.on("connection",(n={},r={})=>{const o=C(r);u(e,o,n),$(n,o,s)})},c=(e="",s={},n=[])=>(a(`node.websockets.${e}.on_close`,n),s?.onClose||s?.on_close?(s?.onClose||s?.on_close)(...n):null),m=(e="",s={},n=[])=>(a(`node.websockets.${e}.on_message`,n),s?.onMessage||s?.on_message?(s?.onMessage||s?.on_message)(...n):null),g=(e="",s={},n=[])=>(a(`node.websockets.${e}.on_open`,n),s?.onOpen||s?.on_open?(s?.onOpen||s?.on_open)(...n):null),v=(e="")=>new y.WebSocketServer({noServer:!0,path:`/api/_websockets/${e}`}),J=(e={})=>({uploaders:{server:v("uploaders")},...Object.entries(e||{}).reduce((s={},[n,r])=>(s[n]={server:v(n),on_open:(...o)=>g(n,r,o),onOpen:(...o)=>g(n,r,o),on_message:(...o)=>m(n,r,o),onMessage:(...o)=>m(n,r,o),on_close:(...o)=>c(n,r,o),onClose:(...o)=>c(n,r,o)},s),{})}),M=(e={},s={})=>{const n=J(e),r=Object.entries(n);for(let o=0;o<r?.length;o+=1){const[t,p]=r[o];E(t,p)}j(s.express.server,n)};var W=M;export{W as default};
|