From 0ba54a2b3757e09fd11e5809379289aec68cfb77 Mon Sep 17 00:00:00 2001 From: bhavya3024 Date: Wed, 21 Dec 2022 02:35:06 +0530 Subject: [PATCH] typescript migration --- .gitignore | 1 + app.ts | 44 ++-- build/.gitignore | 4 - build/export/.gitignore | 3 - build/export/README | 5 - commitlint.config.js | 2 +- copy-non-ts-files.js | 7 + install/{databases.js => databases.ts} | 15 +- install/{web.js => web.ts} | 51 ++-- loader.js | 2 +- nodebb | 3 +- public/src/client/topic/glance.js | 2 +- public/src/modules/helpers.common.js | 2 +- public/src/modules/slugify.js | 2 +- public/src/modules/translator.common.js | 2 +- public/src/utils.js | 2 +- rename.sh | 2 +- require-main.ts | 1 + src/admin/search.ts | 33 +-- src/admin/versions.ts | 15 +- src/als.ts | 4 +- src/analytics.ts | 34 +-- src/api/categories.ts | 14 +- src/api/chats.ts | 19 +- src/api/flags.ts | 10 +- src/api/groups.ts | 21 +- src/api/helpers.ts | 30 +-- src/api/index.ts | 23 +- src/api/posts.ts | 31 +-- src/api/topics.ts | 21 +- src/api/users.ts | 47 ++-- src/batch.ts | 20 +- src/cache.ts | 4 +- src/cache/lru.ts | 15 +- src/cache/ttl.ts | 11 +- src/cacheCreate.ts | 2 +- src/categories/activeusers.ts | 9 +- src/categories/create.ts | 21 +- src/categories/data.ts | 13 +- src/categories/delete.ts | 20 +- src/categories/index.ts | 57 +++-- src/categories/recentreplies.ts | 27 +- src/categories/search.ts | 17 +- src/categories/topics.ts | 16 +- src/categories/unread.ts | 4 +- src/categories/update.ts | 16 +- src/categories/watch.ts | 6 +- src/cli/colors.ts | 8 +- src/cli/index.ts | 119 ++++----- src/cli/manage.ts | 98 ++++---- src/cli/package-install.ts | 31 ++- src/cli/reset.ts | 45 ++-- src/cli/running.ts | 57 ++--- src/cli/setup.ts | 43 ++-- src/cli/upgrade-plugins.ts | 46 ++-- src/cli/upgrade.ts | 35 +-- src/cli/user.ts | 49 ++-- src/constants.ts | 16 +- src/controllers/404.ts | 26 +- src/controllers/accounts.ts | 45 ++-- src/controllers/accounts/blocks.ts | 14 +- src/controllers/accounts/categories.ts | 16 +- src/controllers/accounts/chats.ts | 14 +- src/controllers/accounts/consent.ts | 12 +- src/controllers/accounts/edit.ts | 22 +- src/controllers/accounts/follow.ts | 12 +- src/controllers/accounts/groups.ts | 10 +- src/controllers/accounts/helpers.ts | 36 +-- src/controllers/accounts/info.ts | 14 +- src/controllers/accounts/notifications.ts | 12 +- src/controllers/accounts/posts.ts | 26 +- src/controllers/accounts/profile.ts | 29 +-- src/controllers/accounts/sessions.ts | 10 +- src/controllers/accounts/settings.ts | 39 +-- src/controllers/accounts/uploads.ts | 20 +- src/controllers/admin.ts | 75 +++--- src/controllers/admin/admins-mods.ts | 21 +- src/controllers/admin/appearance.ts | 4 +- src/controllers/admin/cache.ts | 33 +-- src/controllers/admin/categories.ts | 22 +- src/controllers/admin/dashboard.ts | 47 ++-- src/controllers/admin/database.ts | 16 +- src/controllers/admin/digest.ts | 10 +- src/controllers/admin/errors.ts | 13 +- src/controllers/admin/events.ts | 14 +- src/controllers/admin/groups.ts | 23 +- src/controllers/admin/hooks.ts | 8 +- src/controllers/admin/info.ts | 40 +-- src/controllers/admin/logger.ts | 4 +- src/controllers/admin/logs.ts | 13 +- src/controllers/admin/plugins.ts | 14 +- src/controllers/admin/privileges.ts | 10 +- src/controllers/admin/rewards.ts | 6 +- src/controllers/admin/settings.ts | 26 +- src/controllers/admin/tags.ts | 6 +- src/controllers/admin/themes.ts | 15 +- src/controllers/admin/uploads.ts | 45 ++-- src/controllers/admin/users.ts | 28 ++- src/controllers/admin/widgets.ts | 6 +- src/controllers/api.ts | 26 +- src/controllers/authentication.ts | 62 ++--- src/controllers/categories.ts | 21 +- src/controllers/category.ts | 34 +-- src/controllers/composer.ts | 21 +- src/controllers/errors.ts | 24 +- src/controllers/globalmods.ts | 13 +- src/controllers/groups.ts | 21 +- src/controllers/helpers.ts | 44 ++-- src/controllers/home.ts | 19 +- src/controllers/index.ts | 121 +++++---- src/controllers/mods.ts | 24 +- src/controllers/osd.ts | 11 +- src/controllers/ping.ts | 8 +- src/controllers/popular.ts | 13 +- src/controllers/posts.ts | 14 +- src/controllers/recent.ts | 21 +- src/controllers/search.ts | 25 +- src/controllers/sitemap.ts | 8 +- src/controllers/tags.ts | 27 +- src/controllers/top.ts | 13 +- src/controllers/topics.ts | 32 +-- src/controllers/unread.ts | 23 +- src/controllers/uploads.ts | 34 +-- src/controllers/user.ts | 13 +- src/controllers/users.ts | 23 +- src/controllers/write/admin.ts | 13 +- src/controllers/write/categories.ts | 13 +- src/controllers/write/chats.ts | 11 +- src/controllers/write/files.ts | 8 +- src/controllers/write/flags.ts | 12 +- src/controllers/write/groups.ts | 9 +- src/controllers/write/index.ts | 35 ++- src/controllers/write/posts.ts | 15 +- src/controllers/write/topics.ts | 20 +- src/controllers/write/users.ts | 37 ++- src/controllers/write/utilities.ts | 10 +- src/coverPhoto.ts | 8 +- src/database/cache.ts | 5 +- src/database/helpers.ts | 6 +- src/database/index.ts | 16 +- src/database/mongo.ts | 48 ++-- src/database/mongo/connection.ts | 14 +- src/database/mongo/hash.ts | 33 +-- src/database/mongo/helpers.ts | 7 +- src/database/mongo/list.ts | 36 +-- src/database/mongo/main.ts | 5 +- src/database/mongo/sets.ts | 10 +- src/database/mongo/sorted.ts | 47 ++-- src/database/mongo/sorted/{add.js => add.ts} | 9 +- .../sorted/{intersect.js => intersect.ts} | 18 +- .../mongo/sorted/{remove.js => remove.ts} | 6 +- .../mongo/sorted/{union.js => union.ts} | 8 +- src/database/mongo/transaction.ts | 2 +- src/database/postgres.ts | 50 ++-- src/database/postgres/connection.ts | 15 +- src/database/postgres/hash.ts | 4 +- src/database/postgres/helpers.ts | 4 +- src/database/postgres/list.ts | 4 +- src/database/postgres/main.ts | 5 +- src/database/postgres/sets.ts | 7 +- src/database/postgres/sorted.ts | 29 ++- .../postgres/sorted/{add.js => add.ts} | 6 +- .../sorted/{intersect.js => intersect.ts} | 4 +- .../postgres/sorted/{remove.js => remove.ts} | 5 +- .../postgres/sorted/{union.js => union.ts} | 4 +- src/database/postgres/transaction.ts | 6 +- src/database/redis.ts | 44 ++-- src/database/redis/connection.ts | 12 +- src/database/redis/hash.ts | 32 +-- src/database/redis/helpers.ts | 4 +- src/database/redis/list.ts | 5 +- src/database/redis/main.ts | 7 +- src/database/redis/pubsub.ts | 14 +- src/database/redis/sets.ts | 4 +- src/database/redis/sorted.ts | 25 +- src/database/redis/sorted/{add.js => add.ts} | 7 +- .../sorted/{intersect.js => intersect.ts} | 5 +- .../redis/sorted/{remove.js => remove.ts} | 4 +- .../redis/sorted/{union.js => union.ts} | 5 +- src/database/redis/transaction.ts | 2 +- src/emailer.ts | 54 ++-- src/events.ts | 22 +- src/file.ts | 39 +-- src/flags.ts | 45 ++-- src/groups/cache.ts | 4 +- src/groups/cover.ts | 14 +- src/groups/create.ts | 10 +- src/groups/data.ts | 20 +- src/groups/delete.ts | 10 +- src/groups/index.ts | 58 +++-- src/groups/invite.ts | 17 +- src/groups/join.ts | 15 +- src/groups/leave.ts | 12 +- src/groups/membership.ts | 11 +- src/groups/ownership.ts | 6 +- src/groups/posts.ts | 10 +- src/groups/search.ts | 6 +- src/groups/update.ts | 31 +-- src/groups/user.ts | 8 +- src/helpers.ts | 14 +- src/image.ts | 31 ++- src/install.ts | 109 ++++---- src/languages.ts | 21 +- src/logger.ts | 32 +-- src/messaging/create.ts | 14 +- src/messaging/data.ts | 13 +- src/messaging/delete.ts | 5 +- src/messaging/edit.ts | 13 +- src/messaging/index.ts | 42 ++-- src/messaging/notifications.ts | 19 +- src/messaging/rooms.ts | 15 +- src/messaging/unread.ts | 6 +- src/meta/aliases.ts | 13 +- src/meta/blacklist.ts | 39 ++- src/meta/build.ts | 61 +++-- src/meta/cacheBuster.ts | 24 +- src/meta/configs.ts | 39 +-- src/meta/css.ts | 26 +- src/meta/debugFork.ts | 14 +- src/meta/dependencies.ts | 28 +-- src/meta/errors.ts | 18 +- src/meta/index.ts | 51 ++-- src/meta/js.ts | 24 +- src/meta/languages.ts | 31 ++- src/meta/logs.ts | 8 +- src/meta/minifier.ts | 47 ++-- src/meta/settings.ts | 17 +- src/meta/tags.ts | 17 +- src/meta/templates.ts | 36 +-- src/meta/themes.ts | 35 +-- src/middleware/admin.ts | 19 +- src/middleware/assert.ts | 30 +-- src/middleware/expose.ts | 8 +- src/middleware/header.ts | 15 +- src/middleware/headers.ts | 25 +- src/middleware/helpers.ts | 21 +- src/middleware/index.ts | 75 +++--- src/middleware/maintenance.ts | 14 +- src/middleware/ratelimit.ts | 6 +- src/middleware/render.ts | 58 ++--- src/middleware/uploads.ts | 14 +- src/middleware/user.ts | 27 +- src/navigation/admin.ts | 20 +- src/navigation/index.ts | 15 +- src/notifications.ts | 55 ++-- src/pagination.ts | 12 +- src/password.ts | 31 +-- src/plugins/data.ts | 28 +-- src/plugins/hooks.ts | 27 +- src/plugins/index.ts | 69 ++--- src/plugins/install.ts | 33 ++- src/plugins/load.ts | 25 +- src/plugins/usage.ts | 22 +- src/posts/bookmarks.ts | 6 +- src/posts/cache.ts | 11 +- src/posts/category.ts | 10 +- src/posts/create.ts | 23 +- src/posts/data.ts | 8 +- src/posts/delete.ts | 27 +- src/posts/diffs.ts | 21 +- src/posts/edit.ts | 33 ++- src/posts/index.ts | 66 +++-- src/posts/parse.ts | 29 ++- src/posts/queue.ts | 39 +-- src/posts/recent.ts | 9 +- src/posts/summary.ts | 17 +- src/posts/tools.ts | 4 +- src/posts/topics.ts | 8 +- src/posts/uploads.ts | 38 +-- src/posts/user.ts | 23 +- src/posts/votes.ts | 18 +- src/prestart.ts | 37 ++- src/privileges/admin.ts | 19 +- src/privileges/categories.ts | 21 +- src/privileges/global.ts | 25 +- src/privileges/helpers.ts | 20 +- src/privileges/index.ts | 30 ++- src/privileges/posts.ts | 27 +- src/privileges/topics.ts | 23 +- src/privileges/users.ts | 22 +- src/promisify.ts | 6 +- src/pubsub.ts | 16 +- src/rewards/admin.ts | 13 +- src/rewards/index.ts | 14 +- src/routes/admin.ts | 7 +- src/routes/api.ts | 10 +- src/routes/authentication.ts | 28 ++- src/routes/debug.ts | 13 +- src/routes/feeds.ts | 36 +-- src/routes/helpers.ts | 12 +- src/routes/index.ts | 34 ++- src/routes/meta.ts | 6 +- src/routes/user.ts | 4 +- src/routes/write/admin.ts | 12 +- src/routes/write/categories.ts | 11 +- src/routes/write/chats.ts | 12 +- src/routes/write/files.ts | 12 +- src/routes/write/flags.ts | 11 +- src/routes/write/groups.ts | 11 +- src/routes/write/index.ts | 21 +- src/routes/write/posts.ts | 12 +- src/routes/write/topics.ts | 14 +- src/routes/write/users.ts | 12 +- src/routes/write/utilities.ts | 11 +- src/search.ts | 30 ++- src/settings.ts | 8 +- src/sitemap.ts | 28 ++- src/slugify.ts | 4 +- src/social.ts | 16 +- src/socket.io/admin.ts | 85 ++++--- src/socket.io/admin/analytics.ts | 8 +- src/socket.io/admin/cache.ts | 8 +- src/socket.io/admin/categories.ts | 6 +- src/socket.io/admin/config.ts | 16 +- src/socket.io/admin/digest.ts | 8 +- src/socket.io/admin/email.ts | 16 +- src/socket.io/admin/errors.ts | 6 +- src/socket.io/admin/logs.ts | 6 +- src/socket.io/admin/navigation.ts | 6 +- src/socket.io/admin/plugins.ts | 13 +- src/socket.io/admin/rewards.ts | 6 +- src/socket.io/admin/rooms.ts | 26 +- src/socket.io/admin/settings.ts | 8 +- src/socket.io/admin/social.ts | 6 +- src/socket.io/admin/tags.ts | 6 +- src/socket.io/admin/themes.ts | 8 +- src/socket.io/admin/user.ts | 26 +- src/socket.io/admin/widgets.ts | 6 +- src/socket.io/blacklist.ts | 13 +- src/socket.io/categories.ts | 15 +- src/socket.io/categories/search.ts | 15 +- src/socket.io/groups.ts | 16 +- src/socket.io/helpers.ts | 32 +-- src/socket.io/index.ts | 49 ++-- src/socket.io/meta.ts | 8 +- src/socket.io/modules.ts | 26 +- src/socket.io/notifications.ts | 11 +- src/socket.io/plugins.ts | 4 +- src/socket.io/posts.ts | 42 ++-- src/socket.io/posts/tools.ts | 23 +- src/socket.io/posts/votes.ts | 12 +- src/socket.io/topics.ts | 43 ++-- src/socket.io/topics/infinitescroll.ts | 12 +- src/socket.io/topics/merge.ts | 8 +- src/socket.io/topics/move.ts | 16 +- src/socket.io/topics/tags.ts | 14 +- src/socket.io/topics/tools.ts | 8 +- src/socket.io/topics/unread.ts | 8 +- src/socket.io/uploads.ts | 14 +- src/socket.io/user.ts | 48 ++-- src/socket.io/user/picture.ts | 6 +- src/socket.io/user/profile.ts | 8 +- src/socket.io/user/registration.ts | 6 +- src/socket.io/user/status.ts | 8 +- src/start.ts | 71 +++--- src/topics/bookmarks.ts | 10 +- src/topics/create.ts | 29 ++- src/topics/data.ts | 15 +- src/topics/delete.ts | 15 +- src/topics/events.ts | 35 +-- src/topics/follow.ts | 12 +- src/topics/fork.ts | 14 +- src/topics/index.ts | 91 ++++--- src/topics/merge.ts | 8 +- src/topics/posts.ts | 21 +- src/topics/recent.ts | 8 +- src/topics/scheduled.ts | 23 +- src/topics/sorted.ts | 19 +- src/topics/suggested.ts | 13 +- src/topics/tags.ts | 25 +- src/topics/teaser.ts | 18 +- src/topics/thumbs.ts | 27 +- src/topics/tools.ts | 21 +- src/topics/unread.ts | 27 +- src/topics/user.ts | 4 +- src/translator.ts | 13 +- src/upgrade.ts | 47 ++-- src/upgrades/1.0.0/chat_room_hashes.ts | 6 +- src/upgrades/1.0.0/chat_upgrade.ts | 8 +- src/upgrades/1.0.0/global_moderators.ts | 6 +- src/upgrades/1.0.0/social_post_sharing.ts | 9 +- src/upgrades/1.0.0/theme_to_active_plugins.ts | 4 +- src/upgrades/1.0.0/user_best_posts.ts | 11 +- src/upgrades/1.0.0/users_notvalidated.ts | 11 +- .../1.1.0/assign_topic_read_privilege.ts | 10 +- .../dismiss_flags_from_deleted_topics.ts | 11 +- src/upgrades/1.1.0/group_title_update.ts | 13 +- .../1.1.0/separate_upvote_downvote.ts | 15 +- src/upgrades/1.1.0/user_post_count_per_tid.ts | 12 +- .../1.1.1/remove_negative_best_posts.ts | 10 +- src/upgrades/1.1.1/upload_privileges.ts | 12 +- .../1.10.0/hash_recent_ip_addresses.ts | 18 +- src/upgrades/1.10.0/post_history_privilege.ts | 12 +- src/upgrades/1.10.0/search_privileges.ts | 7 +- src/upgrades/1.10.0/view_deleted_privilege.ts | 6 +- src/upgrades/1.10.2/event_filters.ts | 10 +- .../1.10.2/fix_category_post_zsets.ts | 14 +- .../1.10.2/fix_category_topic_zsets.ts | 12 +- src/upgrades/1.10.2/local_login_privileges.ts | 7 +- src/upgrades/1.10.2/postgres_sessions.ts | 8 +- src/upgrades/1.10.2/upgrade_bans_to_hashes.ts | 12 +- src/upgrades/1.10.2/username_email_history.ts | 12 +- .../1.11.0/navigation_visibility_groups.ts | 7 +- src/upgrades/1.11.0/resize_image_width.ts | 6 +- .../1.11.0/widget_visibility_groups.ts | 7 +- .../1.11.1/remove_ignored_cids_per_user.ts | 10 +- src/upgrades/1.12.0/category_watch_state.ts | 12 +- src/upgrades/1.12.0/global_view_privileges.ts | 12 +- src/upgrades/1.12.0/group_create_privilege.ts | 10 +- .../1.12.1/clear_username_email_history.ts | 10 +- .../1.12.1/moderation_notes_refactor.ts | 10 +- src/upgrades/1.12.1/post_upload_sizes.ts | 12 +- src/upgrades/1.12.3/disable_plugin_metrics.ts | 6 +- .../1.12.3/give_mod_info_privilege.ts | 14 +- src/upgrades/1.12.3/give_mod_privileges.ts | 14 +- .../1.12.3/update_registration_type.ts | 10 +- src/upgrades/1.12.3/user_pid_sets.ts | 14 +- src/upgrades/1.13.0/clean_flag_byCid.ts | 10 +- src/upgrades/1.13.0/clean_post_topic_hash.ts | 10 +- .../1.13.0/cleanup_old_notifications.ts | 12 +- src/upgrades/1.13.3/fix_users_sorted_sets.ts | 10 +- .../1.13.4/remove_allowFileUploads_priv.ts | 10 +- .../1.14.0/fix_category_image_field.ts | 6 +- .../1.14.0/unescape_navigation_titles.ts | 6 +- .../1.14.1/readd_deleted_recent_topics.ts | 7 +- .../1.15.0/add_target_uid_to_flags.ts | 12 +- src/upgrades/1.15.0/consolidate_flags.ts | 14 +- src/upgrades/1.15.0/disable_sounds_plugin.ts | 6 +- src/upgrades/1.15.0/fix_category_colors.ts | 6 +- src/upgrades/1.15.0/fullname_search_set.ts | 12 +- src/upgrades/1.15.0/remove_allow_from_uri.ts | 9 +- .../1.15.0/remove_flag_reporters_zset.ts | 10 +- src/upgrades/1.15.0/topic_poster_count.ts | 10 +- src/upgrades/1.15.0/track_flags_by_target.ts | 6 +- src/upgrades/1.15.0/verified_users_group.ts | 21 +- src/upgrades/1.15.4/clear_purged_replies.ts | 12 +- src/upgrades/1.16.0/category_tags.ts | 14 +- src/upgrades/1.16.0/migrate_thumbs.ts | 16 +- src/upgrades/1.17.0/banned_users_group.ts | 14 +- src/upgrades/1.17.0/category_name_zset.ts | 10 +- src/upgrades/1.17.0/default_favicon.ts | 9 +- ...edule_privilege_for_existing_categories.ts | 10 +- src/upgrades/1.17.0/subcategories_per_page.ts | 10 +- src/upgrades/1.17.0/topic_thumb_count.ts | 12 +- .../enable_include_unverified_emails.ts | 5 +- src/upgrades/1.18.0/topic_tags_refactor.ts | 12 +- src/upgrades/1.18.4/category_topics_views.ts | 12 +- .../1.19.0/navigation-enabled-hashes.ts | 6 +- .../1.19.0/reenable-username-login.ts | 4 +- ...emove_leftover_thumbs_after_topic_purge.ts | 18 +- .../1.19.2/store_downvoted_posts_in_zset.ts | 11 +- src/upgrades/1.19.3/fix_user_uploads_zset.ts | 14 +- .../1.19.3/rename_post_upload_hashes.ts | 9 +- src/upgrades/1.2.0/category_recent_tids.ts | 8 +- .../edit_delete_deletetopic_privileges.ts | 10 +- src/upgrades/1.3.0/favourites_to_bookmarks.ts | 6 +- .../1.3.0/sorted_sets_for_post_replies.ts | 12 +- .../1.4.0/global_and_user_language_keys.ts | 12 +- .../1.4.0/sorted_set_for_pinned_topics.ts | 12 +- src/upgrades/1.4.4/config_urls_update.ts | 6 +- src/upgrades/1.4.4/sound_settings.ts | 11 +- src/upgrades/1.4.6/delete_sessions.ts | 19 +- src/upgrades/1.5.0/allowed_file_extensions.ts | 6 +- src/upgrades/1.5.0/flags_refactor.ts | 12 +- .../1.5.0/moderation_history_refactor.ts | 10 +- src/upgrades/1.5.0/post_votes_zset.ts | 10 +- .../remove_relative_uploaded_profile_cover.ts | 8 +- src/upgrades/1.5.1/rename_mods_group.ts | 13 +- src/upgrades/1.5.2/rss_token_wipe.ts | 12 +- src/upgrades/1.5.2/tags_privilege.ts | 8 +- .../1.6.0/clear-stale-digest-template.ts | 7 +- src/upgrades/1.6.0/generate-email-logo.ts | 14 +- src/upgrades/1.6.0/ipblacklist-fix.ts | 6 +- src/upgrades/1.6.0/robots-config-change.ts | 6 +- .../1.6.2/topics_lastposttime_zset.ts | 8 +- src/upgrades/1.7.0/generate-custom-html.ts | 9 +- src/upgrades/1.7.1/notification-settings.ts | 10 +- src/upgrades/1.7.3/key_value_schema_change.ts | 13 +- src/upgrades/1.7.3/topic_votes.ts | 10 +- src/upgrades/1.7.4/chat_privilege.ts | 6 +- .../1.7.4/fix_moved_topics_byvotes.ts | 10 +- .../1.7.4/fix_user_topics_per_category.ts | 10 +- src/upgrades/1.7.4/global_upload_privilege.ts | 16 +- .../1.7.4/rename_min_reputation_settings.ts | 6 +- src/upgrades/1.7.4/vote_privilege.ts | 12 +- src/upgrades/1.7.6/flatten_navigation_data.ts | 6 +- src/upgrades/1.7.6/notification_types.ts | 6 +- .../1.7.6/update_min_pass_strength.ts | 6 +- .../1.8.0/give_signature_privileges.ts | 6 +- src/upgrades/1.8.0/give_spiders_privileges.ts | 10 +- src/upgrades/1.8.1/diffs_zset_to_listhash.ts | 12 +- .../1.9.0/refresh_post_upload_associations.ts | 6 +- src/upgrades/TEMPLATE | 2 - src/user/admin.ts | 20 +- src/user/approval.ts | 26 +- src/user/auth.ts | 25 +- src/user/bans.ts | 17 +- src/user/blocks.ts | 8 +- src/user/categories.ts | 10 +- src/user/create.ts | 23 +- src/user/data.ts | 21 +- src/user/delete.ts | 28 +-- src/user/digest.ts | 29 ++- src/user/email.ts | 25 +- src/user/follow.ts | 6 +- src/user/index.ts | 107 +++++--- src/user/info.ts | 15 +- src/user/interstitials.ts | 21 +- src/user/invite.ts | 26 +- src/user/jobs.ts | 14 +- src/user/jobs/export-posts.ts | 26 +- src/user/jobs/export-profile.ts | 27 +- src/user/jobs/export-uploads.ts | 23 +- src/user/notifications.ts | 26 +- src/user/online.ts | 11 +- src/user/password.ts | 13 +- src/user/picture.ts | 23 +- src/user/posts.ts | 11 +- src/user/profile.ts | 23 +- src/user/reset.ts | 29 ++- src/user/search.ts | 21 +- src/user/settings.ts | 15 +- src/user/topics.ts | 4 +- src/user/uploads.ts | 18 +- src/utils.ts | 23 +- src/webserver.ts | 238 +++++++++--------- src/widgets/admin.ts | 16 +- src/widgets/index.ts | 28 ++- test/helpers/index.js | 2 +- test/mocks/databasemock.js | 2 +- tsconfig.json | 103 ++++++++ webpack.common.js | 2 +- webpack.dev.js | 2 +- webpack.installer.js | 2 +- webpack.prod.js | 2 +- 535 files changed, 5570 insertions(+), 4522 deletions(-) delete mode 100644 build/.gitignore delete mode 100644 build/export/.gitignore delete mode 100644 build/export/README create mode 100644 copy-non-ts-files.js rename install/{databases.js => databases.ts} (88%) rename install/{web.js => web.ts} (91%) rename src/database/mongo/sorted/{add.js => add.ts} (95%) rename src/database/mongo/sorted/{intersect.js => intersect.ts} (93%) rename src/database/mongo/sorted/{remove.js => remove.ts} (92%) rename src/database/mongo/sorted/{union.js => union.ts} (92%) rename src/database/postgres/sorted/{add.js => add.ts} (96%) rename src/database/postgres/sorted/{intersect.js => intersect.ts} (97%) rename src/database/postgres/sorted/{remove.js => remove.ts} (95%) rename src/database/postgres/sorted/{union.js => union.ts} (96%) rename src/database/redis/sorted/{add.js => add.ts} (94%) rename src/database/redis/sorted/{intersect.js => intersect.ts} (95%) rename src/database/redis/sorted/{remove.js => remove.ts} (93%) rename src/database/redis/sorted/{union.js => union.ts} (94%) create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 23e38016c2..b3a9db6550 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ dist/ +build/ yarn.lock npm-debug.log node_modules/ diff --git a/app.ts b/app.ts index b6067d726b..79e46db789 100644 --- a/app.ts +++ b/app.ts @@ -19,35 +19,40 @@ 'use strict'; -require('./require-main'); +import './require-main'; -const nconf = require('nconf'); +import nconf from 'nconf'; nconf.argv().env({ separator: '__', }); -const winston = require('winston'); -const path = require('path'); +import winston from 'winston'; +import path from 'path'; +import file from './src/file'; +import web from './install/web'; +import * as Upgrade from './src/cli/upgrade'; +import manage from './src/cli/manage'; +import * as Reset from './src/cli/reset'; +import * as Running from './src/cli/running'; +import Setup from './src/cli/setup'; -const file = require('./src/file'); - -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; -global.env = process.env.NODE_ENV || 'production'; +(process as any).env.NODE_ENV = (process as any).env.NODE_ENV || 'production'; +(global as any).env = (process as any).env.NODE_ENV || 'production'; // Alternate configuration file support const configFile = path.resolve(__dirname, nconf.any(['config', 'CONFIG']) || 'config.json'); const configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database')); -const prestart = require('./src/prestart'); +import * as prestart from './src/prestart'; prestart.loadConfig(configFile); prestart.setupWinston(); prestart.versionCheck(); winston.verbose('* using configuration stored in: %s', configFile); -if (!process.send) { +if (!(process as any).send) { // If run using `node app`, log GNU copyright info along with server info winston.info(`NodeBB v${nconf.get('version')} Copyright (C) 2013-${(new Date()).getFullYear()} NodeBB Inc.`); winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); @@ -56,13 +61,13 @@ if (!process.send) { } if (nconf.get('setup') || nconf.get('install')) { - require('./src/cli/setup').setup(); + Setup.setup(); } else if (!configExists) { - require('./install/web').install(nconf.get('port')); + web.install(nconf.get('port')); } else if (nconf.get('upgrade')) { - require('./src/cli/upgrade').upgrade(true); + Upgrade.upgrade(true); } else if (nconf.get('reset')) { - require('./src/cli/reset').reset({ + Reset.reset({ theme: nconf.get('t'), plugin: nconf.get('p'), widgets: nconf.get('w'), @@ -70,13 +75,14 @@ if (nconf.get('setup') || nconf.get('install')) { all: nconf.get('a'), }); } else if (nconf.get('activate')) { - require('./src/cli/manage').activate(nconf.get('activate')); + manage.activate(nconf.get('activate')); } else if (nconf.get('plugins') && typeof nconf.get('plugins') !== 'object') { - require('./src/cli/manage').listPlugins(); + manage.listPlugins(); } else if (nconf.get('build')) { - require('./src/cli/manage').build(nconf.get('build')); + manage.buildWrapper(nconf.get('build')); } else if (nconf.get('events')) { - require('./src/cli/manage').listEvents(); + manage.listEvents(); } else { - require('./src/start').start(); + require('./src/cli/manage') + Running.start(); } diff --git a/build/.gitignore b/build/.gitignore deleted file mode 100644 index 9addbff7eb..0000000000 --- a/build/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -* -*/ -!export -!.gitignore diff --git a/build/export/.gitignore b/build/export/.gitignore deleted file mode 100644 index f8d55e0e3f..0000000000 --- a/build/export/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -. -!.gitignore -!README \ No newline at end of file diff --git a/build/export/README b/build/export/README deleted file mode 100644 index a9015033f4..0000000000 --- a/build/export/README +++ /dev/null @@ -1,5 +0,0 @@ -This directory contains archives of user uploads that are prepared on-demand -when a user wants to retrieve a copy of their uploaded content. - -You can delete the files in here at will. They will just be regenerated if -requested again. \ No newline at end of file diff --git a/commitlint.config.js b/commitlint.config.js index 062d24b868..bb7bdb46df 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = { +module.exports = { extends: ['@commitlint/config-angular'], rules: { 'header-max-length': [1, 'always', 72], diff --git a/copy-non-ts-files.js b/copy-non-ts-files.js new file mode 100644 index 0000000000..af16950977 --- /dev/null +++ b/copy-non-ts-files.js @@ -0,0 +1,7 @@ +'use strict'; + +const fs = require('fs-extra'); + +fs.copy('config.json', 'build'); +fs.copy('src/views', 'build/src/views'); +fs.copy('install', 'build/install'); diff --git a/install/databases.js b/install/databases.ts similarity index 88% rename from install/databases.js rename to install/databases.ts index dbbda8fcff..b1e0a18991 100644 --- a/install/databases.js +++ b/install/databases.ts @@ -1,15 +1,18 @@ 'use strict'; -const prompt = require('prompt'); -const winston = require('winston'); +import prompt from 'prompt'; +import winston from 'winston'; +import redis from '../src/database/redis'; +import mongo from '../src/database/mongo'; +import postgres from '../src/database/postgres'; const questions = { - redis: require('../src/database/redis').questions, - mongo: require('../src/database/mongo').questions, - postgres: require('../src/database/postgres').questions, + redis: redis.questions, + mongo: mongo.questions, + postgres: postgres.questions, }; -module.exports = async function (config) { +export default async function (config) { winston.info(`\nNow configuring ${config.database} database:`); const databaseConfig = await getDatabaseConfig(config); return saveDatabaseConfig(config, databaseConfig); diff --git a/install/web.js b/install/web.ts similarity index 91% rename from install/web.js rename to install/web.ts index b9f75d36ab..39ca41d594 100644 --- a/install/web.js +++ b/install/web.ts @@ -1,19 +1,19 @@ 'use strict'; -const winston = require('winston'); -const express = require('express'); -const bodyParser = require('body-parser'); -const fs = require('fs'); -const path = require('path'); -const childProcess = require('child_process'); - -const webpack = require('webpack'); -const nconf = require('nconf'); - -const Benchpress = require('benchpressjs'); -const mkdirp = require('mkdirp'); -const { paths } = require('../src/constants'); -const sass = require('../src/utils').getSass(); +import winston from 'winston'; +import express from 'express'; +import bodyParser from 'body-parser'; +import fs from 'fs'; +import path from 'path'; +import childProcess from 'child_process'; +import webpack from 'webpack'; +import nconf from 'nconf'; +import Benchpress from 'benchpressjs'; +import mkdirp from 'mkdirp'; +import { paths } from '../src/constants'; +import sass from '../src/utils';; +import util from 'util'; +import webpackCfg from '../webpack.installer'; const app = express(); let server; @@ -22,13 +22,15 @@ const formats = [ winston.format.colorize(), ]; -const timestampFormat = winston.format((info) => { +const timestampFormat: any = winston.format((info) => { const dateString = `${new Date().toISOString()} [${global.process.pid}]`; info.level = `${dateString} - ${info.level}`; return info; }); formats.push(timestampFormat()); +//@ts-ignore formats.push(winston.format.splat()); +//@ts-ignore formats.push(winston.format.simple()); winston.configure({ @@ -45,7 +47,7 @@ winston.configure({ ], }); -const web = module.exports; +const web = {} as any; let installing = false; let success = false; let error = false; @@ -80,14 +82,13 @@ web.install = async function (port) { ]); setupRoutes(); launchExpress(port); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }; async function runWebpack() { - const util = require('util'); - const webpackCfg = require('../webpack.installer'); + const compiler = webpack(webpackCfg); const webpackRun = util.promisify(compiler.run).bind(compiler); await webpackRun(); @@ -202,7 +203,7 @@ async function launch(req, res) { child = childProcess.exec(nconf.get('launchCmd'), { detached: true, stdio: ['ignore', 'ignore', 'ignore'], - }); + } as any); } const filesToDelete = [ @@ -216,13 +217,13 @@ async function launch(req, res) { filename => fs.promises.unlink(filename) ) ); - } catch (err) { + } catch (err: any) { console.log(err.stack); } child.unref(); process.exit(0); - } catch (err) { + } catch (err: any) { winston.error(err.stack); throw err; } @@ -258,7 +259,7 @@ async function compileSass() { }); await fs.promises.writeFile(path.join(__dirname, '../public/installer.css'), scssOutput.css.toString()); - } catch (err) { + } catch (err: any) { winston.error(`Unable to compile SASS: \n${err.stack}`); throw err; } @@ -276,7 +277,7 @@ async function loadDefaults() { try { // eslint-disable-next-line no-bitwise await fs.promises.access(setupDefaultsPath, fs.constants.F_OK | fs.constants.R_OK); - } catch (err) { + } catch (err: any) { // setup.json not found or inaccessible, proceed with no defaults if (err.code !== 'ENOENT') { throw err; @@ -289,3 +290,5 @@ async function loadDefaults() { file: setupDefaultsPath, }); } + +export default web; \ No newline at end of file diff --git a/loader.js b/loader.js index 1d86d3a37e..3ebfc8914c 100644 --- a/loader.js +++ b/loader.js @@ -8,7 +8,7 @@ const { fork } = require('child_process'); const logrotate = require('logrotate-stream'); const mkdirp = require('mkdirp'); -const file = require('./src/file'); +const file = require('./build/src/file'); const pkg = require('./package.json'); const pathToConfig = path.resolve(__dirname, process.env.CONFIG || 'config.json'); diff --git a/nodebb b/nodebb index 546e608cd2..602a5f3e28 100755 --- a/nodebb +++ b/nodebb @@ -2,4 +2,5 @@ 'use strict'; -require('./src/cli'); +console.log('SERIOUSLY?'); +require('./build/src/cli'); diff --git a/public/src/client/topic/glance.js b/public/src/client/topic/glance.js index d8e56ba92c..b13adc5ab4 100644 --- a/public/src/client/topic/glance.js +++ b/public/src/client/topic/glance.js @@ -11,7 +11,7 @@ let trackBottom; let trackHeight; let handleEl; -export default function init() { +module.exports = function init() { const topicEl = document.querySelector('[component="topic"]'); const navigatorEl = document.querySelector('[component="topic/navigator"]'); diff --git a/public/src/modules/helpers.common.js b/public/src/modules/helpers.common.js index 93c7961dbc..6802cc8be5 100644 --- a/public/src/modules/helpers.common.js +++ b/public/src/modules/helpers.common.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (utils, Benchpress, relative_path) { +module.exports = function (utils, Benchpress, relative_path) { Benchpress.setGlobal('true', true); Benchpress.setGlobal('false', false); diff --git a/public/src/modules/slugify.js b/public/src/modules/slugify.js index 3046ed2b94..2bebd4f42a 100644 --- a/public/src/modules/slugify.js +++ b/public/src/modules/slugify.js @@ -5,7 +5,7 @@ if (typeof define === 'function' && define.amd) { define('slugify', ['xregexp'], factory); } else if (typeof exports === 'object') { - module.exports = factory(require('xregexp')); + factory(require('xregexp')); } else { window.slugify = factory(XRegExp); } diff --git a/public/src/modules/translator.common.js b/public/src/modules/translator.common.js index 49a3b59c60..2746f77f04 100644 --- a/public/src/modules/translator.common.js +++ b/public/src/modules/translator.common.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (utils, load, warn) { +module.exports = function (utils, load, warn) { const assign = Object.assign || jQuery.extend; function escapeHTML(str) { diff --git a/public/src/utils.js b/public/src/utils.js index bcb4bdb98f..0f70ab8cf2 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -82,4 +82,4 @@ utils.generateUUID = function () { return uuid.split(/[:/]/g).pop().toLowerCase(); // remove prefixes }; -module.exports = utils; +module.exports = utils; diff --git a/rename.sh b/rename.sh index 9e55f30bf2..0831f298dd 100755 --- a/rename.sh +++ b/rename.sh @@ -1,3 +1,3 @@ -for f in src/**/**/*.js; do +for f in src/user/**/*.js; do git mv "$f" "${f%.js}.ts" done \ No newline at end of file diff --git a/require-main.ts b/require-main.ts index ed26ca1a0a..9c48762570 100644 --- a/require-main.ts +++ b/require-main.ts @@ -4,6 +4,7 @@ // this allows plugins to use `require.main.require` to reference NodeBB modules // without worrying about multiple parent modules if (require.main !== module) { + //@ts-ignore require.main.require = function (path) { return require(path); }; diff --git a/src/admin/search.ts b/src/admin/search.ts index a1ba466191..396d5f40ad 100644 --- a/src/admin/search.ts +++ b/src/admin/search.ts @@ -1,13 +1,14 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const sanitizeHTML = require('sanitize-html'); -const nconf = require('nconf'); -const winston = require('winston'); +import fs from 'fs'; +import path from 'path'; +import sanitizeHTML from 'sanitize-html'; +import nconf from 'nconf'; +import winston from 'winston'; + +import file from '../file'; +import Translator from '../translator'; -const file = require('../file'); -const { Translator } = require('../translator'); function filterDirectories(directories) { return directories.map( @@ -113,7 +114,7 @@ async function buildNamespace(language, namespace) { translations: `${str}\n${title}`, title: title, }; - } catch (err) { + } catch (err: any) { winston.error(err.stack); return { namespace: namespace, @@ -124,7 +125,7 @@ async function buildNamespace(language, namespace) { const cache = {}; -async function getDictionary(language) { +async function getLatestVersionDictionary(language) { if (cache[language]) { return cache[language]; } @@ -134,9 +135,13 @@ async function getDictionary(language) { return params; } -module.exports.getDictionary = getDictionary; -module.exports.filterDirectories = filterDirectories; -module.exports.simplify = simplify; -module.exports.sanitize = sanitize; +const obj = { + getLatestVersionDictionary, + filterDirectories, + simplify, + sanitize +}; +import promisify from '../promisify'; +promisify(obj); -require('../promisify')(module.exports); +export default obj; \ No newline at end of file diff --git a/src/admin/versions.ts b/src/admin/versions.ts index aeb3e7e21c..3f1c5db77a 100644 --- a/src/admin/versions.ts +++ b/src/admin/versions.ts @@ -1,15 +1,17 @@ 'use strict'; -const request = require('request'); +import request from 'request'; -const meta = require('../meta'); +import meta from '../meta'; let versionCache = ''; let versionCacheLastModified = ''; +import promisify from '../promisify'; -const isPrerelease = /^v?\d+\.\d+\.\d+-.+$/; -function getLatestVersion(callback) { +export const isPrereleaseRegex = /^v?\d+\.\d+\.\d+-.+$/; + +export function isPrerelease(callback) { const headers = { Accept: 'application/vnd.github.v3+json', 'User-Agent': encodeURIComponent(`NodeBB Admin Control Panel/${meta.config.title}`), @@ -46,7 +48,6 @@ function getLatestVersion(callback) { }); } -exports.getLatestVersion = getLatestVersion; -exports.isPrerelease = isPrerelease; +promisify({ isPrerelease }); +promisify({ isPrereleaseRegex }); -require('../promisify')(exports); diff --git a/src/als.ts b/src/als.ts index a3aec0220f..0b53a77a8c 100644 --- a/src/als.ts +++ b/src/als.ts @@ -1,7 +1,7 @@ 'use strict'; -const { AsyncLocalStorage } = require('async_hooks'); +import { AsyncLocalStorage } from 'async_hooks'; const asyncLocalStorage = new AsyncLocalStorage(); -module.exports = asyncLocalStorage; +export default asyncLocalStorage; diff --git a/src/analytics.ts b/src/analytics.ts index 03be429637..0804e54017 100644 --- a/src/analytics.ts +++ b/src/analytics.ts @@ -1,22 +1,23 @@ 'use strict'; -const cronJob = require('cron').CronJob; -const winston = require('winston'); -const nconf = require('nconf'); -const crypto = require('crypto'); -const util = require('util'); -const _ = require('lodash'); +import { CronJob } from 'cron'; +const cronJob = CronJob;import winston from 'winston'; +import nconf from 'nconf'; +import crypto from 'crypto'; +import util from 'util'; +import _ from 'lodash'; const sleep = util.promisify(setTimeout); -const db = require('./database'); -const utils = require('./utils'); -const plugins = require('./plugins'); -const meta = require('./meta'); -const pubsub = require('./pubsub'); -const cacheCreate = require('./cache/lru'); +import db from './database'; -const Analytics = module.exports; +import utils from './utils'; +import plugins from './plugins'; +import meta from './meta'; +import pubsub from './pubsub'; +import cacheCreate from './cache/lru'; + +const Analytics = {} as any; const secret = nconf.get('secret'); @@ -194,7 +195,7 @@ Analytics.writeData = async function () { try { await Promise.all(dbQueue); - } catch (err) { + } catch (err: any) { winston.error(`[analytics] Encountered error while writing analytics to data store\n${err.stack}`); } }; @@ -298,4 +299,7 @@ Analytics.getBlacklistAnalytics = async function () { }); }; -require('./promisify')(Analytics); +import promisify from './promisify'; +promisify(Analytics); + +export default Analytics; \ No newline at end of file diff --git a/src/api/categories.ts b/src/api/categories.ts index 2871b6cf9d..52b4d326fe 100644 --- a/src/api/categories.ts +++ b/src/api/categories.ts @@ -1,12 +1,12 @@ 'use strict'; -const categories = require('../categories'); -const events = require('../events'); -const user = require('../user'); -const groups = require('../groups'); -const privileges = require('../privileges'); +import categories from '../categories'; +import events from '../events'; +import user from '../user'; +import groups from '../groups'; +import privileges from '../privileges'; -const categoriesAPI = module.exports; +const categoriesAPI = {} as any; categoriesAPI.get = async function (caller, data) { const [userPrivileges, category] = await Promise.all([ @@ -100,3 +100,5 @@ categoriesAPI.setPrivilege = async (caller, data) => { target: data.member, }); }; + +export default categoriesAPI; \ No newline at end of file diff --git a/src/api/chats.ts b/src/api/chats.ts index 67d2eabe5a..03e73c18c6 100644 --- a/src/api/chats.ts +++ b/src/api/chats.ts @@ -1,16 +1,15 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import user from '../user'; +import meta from '../meta'; +import messaging from '../messaging'; +import plugins from '../plugins'; -const user = require('../user'); -const meta = require('../meta'); -const messaging = require('../messaging'); -const plugins = require('../plugins'); +// const websockets from '../socket.io'; +import socketHelpers from '../socket.io/helpers'; -// const websockets = require('../socket.io'); -const socketHelpers = require('../socket.io/helpers'); - -const chatsAPI = module.exports; +const chatsAPI = {} as any; function rateLimitExceeded(caller) { const session = caller.request ? caller.request.session : caller.session; // socket vs req @@ -118,3 +117,5 @@ chatsAPI.kick = async (caller, data) => { delete data.uids; return chatsAPI.users(caller, data); }; + +export default chatsAPI; \ No newline at end of file diff --git a/src/api/flags.ts b/src/api/flags.ts index 1d77470628..c67b335781 100644 --- a/src/api/flags.ts +++ b/src/api/flags.ts @@ -1,9 +1,9 @@ 'use strict'; -const user = require('../user'); -const flags = require('../flags'); +import user from '../user'; +import flags from '../flags'; -const flagsApi = module.exports; +const flagsApi = {} as any; flagsApi.create = async (caller, data) => { const required = ['type', 'id', 'reason']; @@ -49,7 +49,7 @@ flagsApi.appendNote = async (caller, data) => { if (note.uid !== caller.uid) { throw new Error('[[error:no-privileges]]'); } - } catch (e) { + } catch (e: any) { // Okay if not does not exist in database if (e.message !== '[[error:invalid-data]]') { throw e; @@ -82,3 +82,5 @@ flagsApi.deleteNote = async (caller, data) => { ]); return { notes: notes, history: history }; }; + +export default flagsApi; diff --git a/src/api/groups.ts b/src/api/groups.ts index 9e6aa30d0b..f3ff13ee01 100644 --- a/src/api/groups.ts +++ b/src/api/groups.ts @@ -1,16 +1,15 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import privileges from '../privileges'; +import events from '../events'; +import groups from '../groups'; +import user from '../user'; +import meta from '../meta'; +import notifications from '../notifications'; +import slugify from '../slugify'; -const privileges = require('../privileges'); -const events = require('../events'); -const groups = require('../groups'); -const user = require('../user'); -const meta = require('../meta'); -const notifications = require('../notifications'); -const slugify = require('../slugify'); - -const groupsAPI = module.exports; +const groupsAPI = {} as any; groupsAPI.create = async function (caller, data) { if (!caller.uid) { @@ -236,3 +235,5 @@ function logGroupEvent(caller, event, additional) { ...additional, }); } + +export default groupsAPI; \ No newline at end of file diff --git a/src/api/helpers.ts b/src/api/helpers.ts index 24c2540ccb..e8c76ae2ba 100644 --- a/src/api/helpers.ts +++ b/src/api/helpers.ts @@ -1,24 +1,26 @@ 'use strict'; -const url = require('url'); -const user = require('../user'); -const topics = require('../topics'); -const posts = require('../posts'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const socketHelpers = require('../socket.io/helpers'); -const websockets = require('../socket.io'); -const events = require('../events'); +import url from 'url'; +import user from '../user'; +import topics from '../topics'; +import posts from '../posts'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import socketHelpers from '../socket.io/helpers'; +import websockets from '../socket.io'; +import events from '../events'; -exports.setDefaultPostData = function (reqOrSocket, data) { + + +export const setDefaultPostData = function (reqOrSocket, data) { data.uid = reqOrSocket.uid; - data.req = exports.buildReqObject(reqOrSocket, { ...data }); + data.req = buildReqObject(reqOrSocket, { ...data }); data.timestamp = Date.now(); data.fromQueue = false; }; // creates a slimmed down version of the request object -exports.buildReqObject = (req, payload) => { +export const buildReqObject = (req, payload?) => { req = req || {}; const headers = req.headers || (req.request && req.request.headers) || {}; const encrypted = req.connection ? !!req.connection.encrypted : false; @@ -45,7 +47,7 @@ exports.buildReqObject = (req, payload) => { }; }; -exports.doTopicAction = async function (action, event, caller, { tids }) { +export const doTopicAction = async function (action, event, caller, { tids }: any) { if (!Array.isArray(tids)) { throw new Error('[[error:invalid-tid]]'); } @@ -85,7 +87,7 @@ async function logTopicAction(action, req, tid, title) { }); } -exports.postCommand = async function (caller, command, eventName, notification, data) { +export const postCommand = async function (caller, command, eventName, notification, data) { if (!caller.uid) { throw new Error('[[error:not-logged-in]]'); } diff --git a/src/api/index.ts b/src/api/index.ts index a4b5f3488b..f508646f33 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,11 +1,18 @@ 'use strict'; +import users from './users'; +import groups from './groups'; +import topics from './topics'; +import posts from './posts'; +import chats from './chats'; +import categories from './categories'; +import flags from './flags'; -module.exports = { - users: require('./users'), - groups: require('./groups'), - topics: require('./topics'), - posts: require('./posts'), - chats: require('./chats'), - categories: require('./categories'), - flags: require('./flags'), +export default { + users, + groups, + topics, + posts, + chats, + categories, + flags, }; diff --git a/src/api/posts.ts b/src/api/posts.ts index abd40eda38..dc19cf11cb 100644 --- a/src/api/posts.ts +++ b/src/api/posts.ts @@ -1,21 +1,20 @@ 'use strict'; -const validator = require('validator'); -const _ = require('lodash'); +import validator from 'validator'; +import _ from 'lodash'; +import utils from '../utils'; +import user from '../user'; +import posts from '../posts'; +import topics from '../topics'; +import groups from '../groups'; +import meta from '../meta'; +import events from '../events'; +import privileges from '../privileges'; +import * as apiHelpers from './helpers'; +import websockets from '../socket.io'; +import socketHelpers from '../socket.io/helpers'; -const utils = require('../utils'); -const user = require('../user'); -const posts = require('../posts'); -const topics = require('../topics'); -const groups = require('../groups'); -const meta = require('../meta'); -const events = require('../events'); -const privileges = require('../privileges'); -const apiHelpers = require('./helpers'); -const websockets = require('../socket.io'); -const socketHelpers = require('../socket.io/helpers'); - -const postsAPI = module.exports; +const postsAPI = {} as any; postsAPI.get = async function (caller, data) { const [userPrivileges, post, voted] = await Promise.all([ @@ -333,3 +332,5 @@ postsAPI.restoreDiff = async (caller, data) => { const edit = await posts.diffs.restore(data.pid, data.since, caller.uid, apiHelpers.buildReqObject(caller)); websockets.in(`topic_${edit.topic.tid}`).emit('event:post_edited', edit); }; + +export default postsAPI; \ No newline at end of file diff --git a/src/api/topics.ts b/src/api/topics.ts index 3cd98f0c20..341fe58fe6 100644 --- a/src/api/topics.ts +++ b/src/api/topics.ts @@ -1,19 +1,20 @@ 'use strict'; -const user = require('../user'); -const topics = require('../topics'); -const posts = require('../posts'); -const meta = require('../meta'); -const privileges = require('../privileges'); +import user from '../user'; +import topics from '../topics'; +import posts from '../posts'; +import meta from '../meta'; -const apiHelpers = require('./helpers'); +import privileges from '../privileges'; + +import * as apiHelpers from './helpers'; const { doTopicAction } = apiHelpers; -const websockets = require('../socket.io'); -const socketHelpers = require('../socket.io/helpers'); +import websockets from '../socket.io'; +import socketHelpers from '../socket.io/helpers'; -const topicsAPI = module.exports; +const topicsAPI = {} as any; topicsAPI.get = async function (caller, data) { const [userPrivileges, topic] = await Promise.all([ @@ -152,3 +153,5 @@ topicsAPI.ignore = async function (caller, data) { topicsAPI.unfollow = async function (caller, data) { await topics.unfollow(data.tid, caller.uid); }; + +export default topicsAPI; \ No newline at end of file diff --git a/src/api/users.ts b/src/api/users.ts index c0bdf57cd6..e384623894 100644 --- a/src/api/users.ts +++ b/src/api/users.ts @@ -1,21 +1,21 @@ 'use strict'; -const validator = require('validator'); -const winston = require('winston'); +import validator from 'validator'; +import winston from 'winston'; +import db from '../database'; +import user from '../user'; +import groups from '../groups'; +import meta from '../meta'; +import child from 'child_process'; +import flags from '../flags'; +import privileges from '../privileges'; +import notifications from '../notifications'; +import plugins from '../plugins'; +import events from '../events'; +import translator from '../translator'; +import sockets from '../socket.io'; -const db = require('../database'); -const user = require('../user'); -const groups = require('../groups'); -const meta = require('../meta'); -const flags = require('../flags'); -const privileges = require('../privileges'); -const notifications = require('../notifications'); -const plugins = require('../plugins'); -const events = require('../events'); -const translator = require('../translator'); -const sockets = require('../socket.io'); - -const usersAPI = module.exports; +const usersAPI = {} as any; usersAPI.create = async function (caller, data) { if (!data) { @@ -91,7 +91,7 @@ usersAPI.deleteAccount = async function (caller, { uid, password }) { usersAPI.deleteMany = async function (caller, data) { if (await canDeleteUids(data.uids)) { - await Promise.all(data.uids.map(uid => processDeletion({ uid, method: 'delete', caller }))); + await Promise.all(data.uids.map(uid => processDeletion({ uid, method: 'delete', caller } as any))); } }; @@ -244,7 +244,7 @@ usersAPI.mute = async function (caller, data) { uid: data.uid, timestamp: now, expire: data.until, - }; + } as any; if (data.reason) { muteData.reason = reason; } @@ -448,16 +448,15 @@ usersAPI.generateExport = async (caller, { uid, type }) => { if (count > 1) { throw new Error('[[error:already-exporting]]'); } - - const child = require('child_process').fork(`./src/user/jobs/export-${type}.js`, [], { - env: process.env, + (child as any).fork(`./src/user/jobs/export-${type}.js`, [], { + env: (process as any).env, }); - child.send({ uid }); - child.on('error', async (err) => { + (child as any).send({ uid }); + (child as any).on('error', async (err) => { winston.error(err.stack); await db.deleteObjectField('locks', `export:${uid}${type}`); }); - child.on('exit', async () => { + (child as any).on('exit', async () => { await db.deleteObjectField('locks', `export:${uid}${type}`); const { displayname } = await user.getUserFields(uid, ['username']); const n = await notifications.create({ @@ -475,3 +474,5 @@ usersAPI.generateExport = async (caller, { uid, type }) => { }); }); }; + +export default usersAPI; \ No newline at end of file diff --git a/src/batch.ts b/src/batch.ts index 8442def721..f99e059636 100644 --- a/src/batch.ts +++ b/src/batch.ts @@ -1,16 +1,19 @@ 'use strict'; -const util = require('util'); +import util from 'util'; + +import db from './database'; + +import utils from './utils'; +import promisify from './promisify'; -const db = require('./database'); -const utils = require('./utils'); const DEFAULT_BATCH_SIZE = 100; const sleep = util.promisify(setTimeout); -exports.processSortedSet = async function (setKey, process, options) { +export const processSortedSet = async function (setKey, process, options , callback?) { options = options || {}; if (typeof process !== 'function') { @@ -35,7 +38,7 @@ exports.processSortedSet = async function (setKey, process, options) { let start = 0; let stop = options.batch - 1; - if (process && process.constructor && process.constructor.name !== 'AsyncFunction') { + if (process && (process as any).constructor && (process as any).constructor.name !== 'AsyncFunction') { process = util.promisify(process); } @@ -56,7 +59,7 @@ exports.processSortedSet = async function (setKey, process, options) { } }; -exports.processArray = async function (array, process, options) { +export const processArray = async function (array, process, options) { options = options || {}; if (!Array.isArray(array) || !array.length) { @@ -68,7 +71,7 @@ exports.processArray = async function (array, process, options) { const batch = options.batch || DEFAULT_BATCH_SIZE; let start = 0; - if (process && process.constructor && process.constructor.name !== 'AsyncFunction') { + if (process && (process as any).constructor && (process as any).constructor.name !== 'AsyncFunction') { process = util.promisify(process); } @@ -89,4 +92,5 @@ exports.processArray = async function (array, process, options) { } }; -require('./promisify')(exports); +promisify({ processArray }); +promisify({ processSortedSet }); \ No newline at end of file diff --git a/src/cache.ts b/src/cache.ts index 996faf9237..e96e0d62c9 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -1,8 +1,8 @@ 'use strict'; -const cacheCreate = require('./cache/lru'); +import cacheCreate from './cache/lru'; -module.exports = cacheCreate({ +export default cacheCreate({ name: 'local', max: 40000, ttl: 0, diff --git a/src/cache/lru.ts b/src/cache/lru.ts index 3434e0773b..c68145d06a 100644 --- a/src/cache/lru.ts +++ b/src/cache/lru.ts @@ -1,12 +1,11 @@ 'use strict'; -module.exports = function (opts) { - const LRU = require('lru-cache'); - const pubsub = require('../pubsub'); +import LRU from 'lru-cache'; +import pubsub from '../pubsub'; +import winston from 'winston'; +import chalk from 'chalk'; - // lru-cache@7 deprecations - const winston = require('winston'); - const chalk = require('chalk'); +export default function (opts) { // sometimes we kept passing in `length` with no corresponding `maxSize`. // This is now enforced in v7; drop superfluous property @@ -30,7 +29,7 @@ module.exports = function (opts) { const lruCache = new LRU(opts); - const cache = {}; + const cache = {} as any; cache.name = opts.name; cache.hits = 0; cache.misses = 0; @@ -61,7 +60,7 @@ module.exports = function (opts) { if (!cache.enabled) { return; } - const opts = {}; + const opts = {} as any; if (ttl) { opts.ttl = ttl; } diff --git a/src/cache/ttl.ts b/src/cache/ttl.ts index be7e795616..f3c5c2832c 100644 --- a/src/cache/ttl.ts +++ b/src/cache/ttl.ts @@ -1,12 +1,13 @@ 'use strict'; -module.exports = function (opts) { - const TTLCache = require('@isaacs/ttlcache'); - const pubsub = require('../pubsub'); +import TTLCache from '@isaacs/ttlcache'; +import pubsub from '../pubsub'; + +export default function (opts) { const ttlCache = new TTLCache(opts); - const cache = {}; + const cache = {} as any; cache.name = opts.name; cache.hits = 0; cache.misses = 0; @@ -34,7 +35,7 @@ module.exports = function (opts) { if (!cache.enabled) { return; } - const opts = {}; + const opts = {} as any; if (ttl) { opts.ttl = ttl; } diff --git a/src/cacheCreate.ts b/src/cacheCreate.ts index 14a5a7a79b..c878650b29 100644 --- a/src/cacheCreate.ts +++ b/src/cacheCreate.ts @@ -1,3 +1,3 @@ 'use strict'; -module.exports = require('./cache/lru'); +export * from './cache/lru'; diff --git a/src/categories/activeusers.ts b/src/categories/activeusers.ts index 4a55be445a..3b17b3003c 100644 --- a/src/categories/activeusers.ts +++ b/src/categories/activeusers.ts @@ -1,11 +1,10 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import posts from '../posts'; +import db from '../database'; -const posts = require('../posts'); -const db = require('../database'); - -module.exports = function (Categories) { +export default function (Categories) { Categories.getActiveUsers = async function (cids) { if (!Array.isArray(cids)) { cids = [cids]; diff --git a/src/categories/create.ts b/src/categories/create.ts index 40e434bbe8..2008a65cab 100644 --- a/src/categories/create.ts +++ b/src/categories/create.ts @@ -1,16 +1,15 @@ 'use strict'; -const async = require('async'); -const _ = require('lodash'); +import async from 'async'; +import _ from 'lodash'; +import db from '../database'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import utils from '../utils'; +import slugify from '../slugify'; +import cache from '../cache'; -const db = require('../database'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const cache = require('../cache'); - -module.exports = function (Categories) { +export default function (Categories) { Categories.create = async function (data) { const parentCid = data.parentCid ? data.parentCid : 0; const [cid, firstChild] = await Promise.all([ @@ -44,7 +43,7 @@ module.exports = function (Categories) { imageClass: 'cover', isSection: 0, subCategoriesPerPage: 10, - }; + } as any; if (data.backgroundImage) { category.backgroundImage = data.backgroundImage; diff --git a/src/categories/data.ts b/src/categories/data.ts index 4568d4850d..d1e046732a 100644 --- a/src/categories/data.ts +++ b/src/categories/data.ts @@ -1,11 +1,10 @@ 'use strict'; -const validator = require('validator'); - -const db = require('../database'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import validator from 'validator'; +import db from '../database'; +import meta from '../meta'; +import plugins from '../plugins'; +import utils from '../utils'; const intFields = [ 'cid', 'parentCid', 'disabled', 'isSection', 'order', @@ -13,7 +12,7 @@ const intFields = [ 'minTags', 'maxTags', 'postQueue', 'subCategoriesPerPage', ]; -module.exports = function (Categories) { +export default function (Categories) { Categories.getCategoriesFields = async function (cids, fields) { if (!Array.isArray(cids) || !cids.length) { return []; diff --git a/src/categories/delete.ts b/src/categories/delete.ts index a03d96ee37..a03e7b28a2 100644 --- a/src/categories/delete.ts +++ b/src/categories/delete.ts @@ -1,15 +1,15 @@ 'use strict'; -const async = require('async'); -const db = require('../database'); -const batch = require('../batch'); -const plugins = require('../plugins'); -const topics = require('../topics'); -const groups = require('../groups'); -const privileges = require('../privileges'); -const cache = require('../cache'); +import async from 'async'; +import db from '../database'; +import * as batch from '../batch'; +import plugins from '../plugins'; +import topics from '../topics'; +import groups from '../groups'; +import privileges from '../privileges'; +import cache from '../cache'; -module.exports = function (Categories) { +export default function (Categories) { Categories.purge = async function (cid, uid) { await batch.processSortedSet(`cid:${cid}:tids`, async (tids) => { await async.eachLimit(tids, 10, async (tid) => { @@ -60,7 +60,7 @@ module.exports = function (Categories) { db.getSortedSetRange(`cid:${cid}:children`, 0, -1), ]); - const bulkAdd = []; + const bulkAdd = [] as any[]; const childrenKeys = children.map((cid) => { bulkAdd.push(['cid:0:children', cid, cid]); return `category:${cid}`; diff --git a/src/categories/index.ts b/src/categories/index.ts index 5789c25e37..2ac9ebb5c6 100644 --- a/src/categories/index.ts +++ b/src/categories/index.ts @@ -1,28 +1,38 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import user from '../user'; +import groups from '../groups'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import cache from '../cache'; +import meta from '../meta'; -const db = require('../database'); -const user = require('../user'); -const groups = require('../groups'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const cache = require('../cache'); -const meta = require('../meta'); +const Categories = {} as any; +import data from './data'; +import create from './create'; +import deleteCategory from './delete'; +import topics from './topics'; +import unread from './unread'; +import activeUsers from './activeusers'; +import recentReplies from './recentreplies'; +import update from './update'; +import watch from './watch'; +import search from './search'; +import promisify from '../promisify'; -const Categories = module.exports; - -require('./data')(Categories); -require('./create')(Categories); -require('./delete')(Categories); -require('./topics')(Categories); -require('./unread')(Categories); -require('./activeusers')(Categories); -require('./recentreplies')(Categories); -require('./update')(Categories); -require('./watch')(Categories); -require('./search')(Categories); +data(Categories); +create(Categories); +deleteCategory(Categories); +topics(Categories); +unread(Categories); +activeUsers(Categories); +recentReplies(Categories); +update(Categories); +watch(Categories); +search(Categories); Categories.exists = async function (cids) { return await db.exists( @@ -257,7 +267,7 @@ Categories.getParentCids = async function (currentCid) { }; Categories.getChildrenCids = async function (rootCid) { - let allCids = []; + let allCids: number[] = []; async function recursive(keys) { let childrenCids = await db.getSortedSetRange(keys, 0, -1); @@ -313,7 +323,7 @@ Categories.getTree = function (categories, parentCid) { } }); - const tree = []; + const tree = [] as any[]; categories.forEach((category) => { if (category) { @@ -406,4 +416,5 @@ Categories.buildForSelectCategories = function (categories, fields, parentCid) { return categoriesData.map(category => _.pick(category, pickFields)); }; -require('../promisify')(Categories); +promisify(Categories); +export default Categories; \ No newline at end of file diff --git a/src/categories/recentreplies.ts b/src/categories/recentreplies.ts index c7ab8e2fa7..d1a4bf5304 100644 --- a/src/categories/recentreplies.ts +++ b/src/categories/recentreplies.ts @@ -1,17 +1,16 @@ 'use strict'; -const winston = require('winston'); -const _ = require('lodash'); +import winston from 'winston'; +import _ from 'lodash'; +import db from '../database'; +import posts from '../posts'; +import topics from '../topics'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import * as batch from '../batch'; -const db = require('../database'); -const posts = require('../posts'); -const topics = require('../topics'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const batch = require('../batch'); - -module.exports = function (Categories) { +export default function (Categories) { Categories.getRecentReplies = async function (cid, uid, start, stop) { // backwards compatibility, treat start as count if (stop === undefined && start > 0) { @@ -71,7 +70,7 @@ module.exports = function (Categories) { return; } const categoriesToLoad = categoryData.filter(c => c && c.numRecentReplies && parseInt(c.numRecentReplies, 10) > 0); - let keys = []; + let keys = [] as any[]; if (plugins.hooks.hasListeners('filter:categories.getRecentTopicReplies')) { const result = await plugins.hooks.fire('filter:categories.getRecentTopicReplies', { categories: categoriesToLoad, @@ -144,7 +143,7 @@ module.exports = function (Categories) { if (category.posts.length) { return; } - const posts = []; + const posts = [] as any[]; getPostsRecursive(category, posts); posts.sort((a, b) => b.pid - a.pid); @@ -174,8 +173,8 @@ module.exports = function (Categories) { await batch.processArray(pids, async (pids) => { const postData = await posts.getPostsFields(pids, ['pid', 'deleted', 'uid', 'timestamp', 'upvotes', 'downvotes']); - const bulkRemove = []; - const bulkAdd = []; + const bulkRemove = [] as any[]; + const bulkAdd = [] as any[]; postData.forEach((post) => { bulkRemove.push([`cid:${oldCid}:uid:${post.uid}:pids`, post.pid]); bulkRemove.push([`cid:${oldCid}:uid:${post.uid}:pids:votes`, post.pid]); diff --git a/src/categories/search.ts b/src/categories/search.ts index a4f079e2fd..097c4ab7e3 100644 --- a/src/categories/search.ts +++ b/src/categories/search.ts @@ -1,19 +1,18 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import db from '../database'; -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const db = require('../database'); - -module.exports = function (Categories) { +export default function (Categories) { Categories.search = async function (data) { const query = data.query || ''; const page = data.page || 1; const uid = data.uid || 0; const paginate = data.hasOwnProperty('paginate') ? data.paginate : true; - const startTime = process.hrtime(); + const startTime = (process as any).hrtime(); let cids = await findCids(query, data.hardCap); @@ -26,7 +25,7 @@ module.exports = function (Categories) { const searchResult = { matchCount: cids.length, - }; + } as any; if (paginate) { const resultsPerPage = data.resultsPerPage || 50; @@ -57,7 +56,7 @@ module.exports = function (Categories) { } return c1.order - c2.order; }); - searchResult.timing = (process.elapsedTimeSince(startTime) / 1000).toFixed(2); + searchResult.timing = ((process as any).elapsedTimeSince(startTime) / 1000).toFixed(2); searchResult.categories = categoryData.filter(c => cids.includes(c.cid)); return searchResult; }; diff --git a/src/categories/topics.ts b/src/categories/topics.ts index 020713aabe..baa5ca093c 100644 --- a/src/categories/topics.ts +++ b/src/categories/topics.ts @@ -1,13 +1,13 @@ 'use strict'; -const db = require('../database'); -const topics = require('../topics'); -const plugins = require('../plugins'); -const meta = require('../meta'); -const privileges = require('../privileges'); -const user = require('../user'); +import db from '../database'; +import topics from '../topics'; +import plugins from '../plugins'; +import meta from '../meta'; +import privileges from '../privileges'; +import user from '../user'; -module.exports = function (Categories) { +export default function (Categories) { Categories.getCategoryTopics = async function (data) { let results = await plugins.hooks.fire('filter:category.topics.prepare', data); const tids = await Categories.getTopicIds(results); @@ -93,7 +93,7 @@ module.exports = function (Categories) { Categories.buildTopicsSortedSet = async function (data) { const { cid } = data; - let set = `cid:${cid}:tids`; + let set: any = `cid:${cid}:tids`; const sort = data.sort || (data.settings && data.settings.categoryTopicSort) || meta.config.categoryTopicSort || 'newest_to_oldest'; if (sort === 'most_posts') { diff --git a/src/categories/unread.ts b/src/categories/unread.ts index 123afef413..02b9182a22 100644 --- a/src/categories/unread.ts +++ b/src/categories/unread.ts @@ -1,8 +1,8 @@ 'use strict'; -const db = require('../database'); +import db from '../database'; -module.exports = function (Categories) { +export default function (Categories) { Categories.markAsRead = async function (cids, uid) { if (!Array.isArray(cids) || !cids.length || parseInt(uid, 10) <= 0) { return; diff --git a/src/categories/update.ts b/src/categories/update.ts index d4be83edb8..f8a52ab701 100644 --- a/src/categories/update.ts +++ b/src/categories/update.ts @@ -1,14 +1,14 @@ 'use strict'; -const db = require('../database'); -const meta = require('../meta'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const translator = require('../translator'); -const plugins = require('../plugins'); -const cache = require('../cache'); +import db from '../database'; +import meta from '../meta'; +import utils from '../utils'; +import slugify from '../slugify'; +import translator from '../translator'; +import plugins from '../plugins'; +import cache from '../cache'; -module.exports = function (Categories) { +export default function (Categories) { Categories.update = async function (modified) { const cids = Object.keys(modified); await Promise.all(cids.map(cid => updateCategory(cid, modified[cid]))); diff --git a/src/categories/watch.ts b/src/categories/watch.ts index 4a64fa9ec8..292133cbed 100644 --- a/src/categories/watch.ts +++ b/src/categories/watch.ts @@ -1,9 +1,9 @@ 'use strict'; -const db = require('../database'); -const user = require('../user'); +import db from '../database'; +import user from '../user'; -module.exports = function (Categories) { +export default function (Categories) { Categories.watchStates = { ignoring: 1, notwatching: 2, diff --git a/src/cli/colors.ts b/src/cli/colors.ts index 7ddd188898..9c4944d59f 100644 --- a/src/cli/colors.ts +++ b/src/cli/colors.ts @@ -4,8 +4,8 @@ // to include color styling in the output // so the CLI looks nice -const { Command } = require('commander'); -const chalk = require('chalk'); +import { Command } from 'commander'; +import chalk from 'chalk'; const colors = [ // depth = 0, top-level command @@ -31,7 +31,7 @@ function getControlCharacterSpaces(term) { // get depth of command // 0 = top, 1 = subcommand of top, etc -Command.prototype.depth = function () { +(Command.prototype as any).depth = function () { if (this._depth === undefined) { let depth = 0; let { parent } = this; @@ -42,7 +42,7 @@ Command.prototype.depth = function () { return this._depth; }; -module.exports = { +export default { commandUsage(cmd) { const depth = cmd.depth(); diff --git a/src/cli/index.ts b/src/cli/index.ts index 02796cc61a..d2744d5d8e 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -2,20 +2,47 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); +import * as prestart from '../prestart'; +import yargs from 'yargs'; +import fs from 'fs'; +import path from 'path'; +import { paths } from '../constants'; +import nconf from 'nconf'; +const opts = yargs((process as any).argv.slice(2)).help(false).exitProcess(false); +nconf.argv(opts).env({ + separator: '__', +}); + +(process as any).env.NODE_ENV = (process as any).env.NODE_ENV || 'production'; +(global as any).env = (process as any).env.NODE_ENV || 'production'; + +prestart.setupWinston(); + +// Alternate configuration file support +const configFile = path.resolve(paths.baseDir, nconf.get('config') || 'config.json'); +const configExists = fs.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database')); + +prestart.loadConfig(configFile); +prestart.versionCheck(); + +// used for calling the file require('../../require-main'); -const packageInstall = require('./package-install'); -const { paths } = require('../constants'); +import packageInstall from './package-install'; +import semver from 'semver'; +//@ts-ignore +import defaultPackage from '../../install/package.json'; +import chalk from 'chalk'; +import { program } from 'commander'; +import manage from './manage'; + try { fs.accessSync(paths.currentPackage, fs.constants.R_OK); // throw on missing package.json try { // handle missing node_modules/ directory fs.accessSync(paths.nodeModules, fs.constants.R_OK); - } catch (e) { - if (e.code === 'ENOENT') { +} catch (e: any) { if (e.code === 'ENOENT') { // run package installation just to sync up node_modules/ with existing package.json packageInstall.installAll(); } else { @@ -24,13 +51,12 @@ try { } fs.accessSync(path.join(paths.nodeModules, 'semver/package.json'), fs.constants.R_OK); - const semver = require('semver'); - const defaultPackage = require('../../install/package.json'); + const checkVersion = function (packageName) { const { version } = JSON.parse(fs.readFileSync(path.join(paths.nodeModules, packageName, 'package.json'), 'utf8')); if (!semver.satisfies(version, defaultPackage.dependencies[packageName])) { - const e = new TypeError(`Incorrect dependency version: ${packageName}`); + const e: any = new TypeError(`Incorrect dependency version: ${packageName}`); e.code = 'DEP_WRONG_VERSION'; throw e; } @@ -42,7 +68,7 @@ try { checkVersion('chalk'); checkVersion('lodash'); checkVersion('lru-cache'); -} catch (e) { +} catch (e: any) { if (['ENOENT', 'DEP_WRONG_VERSION', 'MODULE_NOT_FOUND'].includes(e.code)) { console.warn('Dependencies outdated or not yet installed.'); console.log('Installing them now...\n'); @@ -51,28 +77,18 @@ try { packageInstall.preserveExtraneousPlugins(); packageInstall.installAll(); - const chalk = require('chalk'); console.log(`${chalk.green('OK')}\n`); } else { throw e; } } -const chalk = require('chalk'); -const nconf = require('nconf'); -const { program } = require('commander'); -const yargs = require('yargs'); - -const pkg = require('../../install/package.json'); -const file = require('../file'); -const prestart = require('../prestart'); - program.configureHelp(require('./colors')); program .name('./nodebb') .description('Welcome to NodeBB') - .version(pkg.version) + .version(defaultPackage.version) .option('--json-logging', 'Output to logs in JSON format', false) .option('--log-level ', 'Default logging level to use', 'info') .option('--config ', 'Specify a config file', 'config.json') @@ -82,29 +98,15 @@ program // provide a yargs object ourselves // otherwise yargs will consume `--help` or `help` // and `nconf` will exit with useless usage info -const opts = yargs(process.argv.slice(2)).help(false).exitProcess(false); -nconf.argv(opts).env({ - separator: '__', -}); -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; -global.env = process.env.NODE_ENV || 'production'; -prestart.setupWinston(); - -// Alternate configuration file support -const configFile = path.resolve(paths.baseDir, nconf.get('config') || 'config.json'); -const configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database')); - -prestart.loadConfig(configFile); -prestart.versionCheck(); - -if (!configExists && process.argv[2] !== 'setup') { +if (!configExists && (process as any).argv[2] !== 'setup') { require('./setup').webInstall(); + // @ts-ignore return; } -process.env.CONFIG = configFile; +(process as any).env.CONFIG = configFile; // running commands program @@ -127,8 +129,8 @@ program }) .description('Start NodeBB in verbose development mode') .action(() => { - process.env.NODE_ENV = 'development'; - global.env = 'development'; + (process as any).env.NODE_ENV = 'development'; + (global as any).env = 'development'; require('./running').start({ ...program.opts(), dev: true }); }); program @@ -162,11 +164,11 @@ program .description('Run the NodeBB setup script, or setup with an initial config') .option('--skip-build', 'Run setup without building assets') .action((initConfig) => { + console.log('INIT CONFIG', initConfig); if (initConfig) { try { initConfig = JSON.parse(initConfig); - } catch (e) { - console.warn(chalk.red('Invalid JSON passed as initial config value.')); + } catch (e: any) { console.warn(chalk.red('Invalid JSON passed as initial config value.')); console.log('If you meant to pass in an initial config value, please try again.\n'); throw e; @@ -181,7 +183,7 @@ program .option('-f, --force', 'Force plugin installation even if it may be incompatible with currently installed NodeBB version') .action((plugin, options) => { if (plugin) { - require('./manage').install(plugin, options); + manage.install(plugin); } else { require('./setup').webInstall(); } @@ -193,11 +195,12 @@ program .option('-s, --series', 'Run builds in series without extra processes') .option('-w, --webpack', 'Bundle assets with webpack', true) .action((targets, options) => { + console.log('HEYYYYY!!!!!!!!!!!'); if (program.opts().dev) { - process.env.NODE_ENV = 'development'; - global.env = 'development'; + (process as any).env.NODE_ENV = 'development'; + (global as any).env = 'development'; } - require('./manage').build(targets.length ? targets : true, options); + manage.buildWrapper(targets.length ? targets : true, options); }) .on('--help', () => { require('../meta/aliases').buildTargets(); @@ -206,25 +209,25 @@ program .command('activate [plugin]') .description('Activate a plugin for the next startup of NodeBB (nodebb-plugin- prefix is optional)') .action((plugin) => { - require('./manage').activate(plugin); + manage.activate(plugin); }); program .command('plugins') .action(() => { - require('./manage').listPlugins(); + manage.listPlugins(); }) .description('List all installed plugins'); program .command('events [count]') .description('Outputs the most recent administrative events recorded by NodeBB') .action((count) => { - require('./manage').listEvents(count); + manage.listEvents(count); }); program .command('info') .description('Outputs various system info') .action(() => { - require('./manage').info(); + manage.info(); }); // reset @@ -246,10 +249,10 @@ resetCommand require('./reset').reset(options, (err) => { if (err) { - return process.exit(1); + return (process as any).exit(1); } - process.exit(0); + (process as any).exit(0); }); }); @@ -277,8 +280,8 @@ program }) .action((scripts, options) => { if (program.opts().dev) { - process.env.NODE_ENV = 'development'; - global.env = 'development'; + (process as any).env.NODE_ENV = 'development'; + (global as any).env = 'development'; } require('./upgrade').upgrade(scripts.length ? scripts : true, options); }); @@ -295,7 +298,7 @@ program throw err; } console.log(chalk.green('OK')); - process.exit(); + (process as any).exit(); }); }); @@ -307,7 +310,7 @@ program return program.help(); } - const command = program.commands.find(command => command._name === name); + const command = program.commands.find(command => (command as any)._name === name); if (command) { command.help(); } else { @@ -316,10 +319,10 @@ program } }); -if (process.argv.length === 2) { +if ((process as any).argv.length === 2) { program.help(); } -program.executables = false; +(program as any).executables = false; program.parse(); diff --git a/src/cli/manage.ts b/src/cli/manage.ts index d67126270c..ab61b9a0f5 100644 --- a/src/cli/manage.ts +++ b/src/cli/manage.ts @@ -1,20 +1,22 @@ 'use strict'; -const winston = require('winston'); -const childProcess = require('child_process'); -const CliGraph = require('cli-graph'); -const chalk = require('chalk'); -const nconf = require('nconf'); +import winston from 'winston'; +import child from 'child_process'; +import CliGraph from 'cli-graph'; +import chalk from 'chalk'; +import nconf from 'nconf'; +import { build } from '../meta/build'; +import db from '../database'; +import plugins from '../plugins'; +import events from '../events'; +import analytics from '../analytics'; +import * as reset from './reset'; +import { pluginNamePattern, themeNamePattern, paths } from '../constants'; +//@ts-ignore +import { version } from '../../package.json'; -const build = require('../meta/build'); -const db = require('../database'); -const plugins = require('../plugins'); -const events = require('../events'); -const analytics = require('../analytics'); -const reset = require('./reset'); -const { pluginNamePattern, themeNamePattern, paths } = require('../constants'); -async function install(plugin, options) { +async function install(plugin, options?) { if (!options) { options = {}; } @@ -31,7 +33,7 @@ async function install(plugin, options) { if (isInstalled) { throw new Error('plugin already installed'); } - const nbbVersion = require(paths.currentPackage).version; + const nbbVersion = require(paths.currentPackage).default.version; const suggested = await plugins.suggest(plugin, nbbVersion); if (!suggested.version) { if (!options.force) { @@ -43,10 +45,10 @@ async function install(plugin, options) { winston.info('Installing Plugin `%s@%s`', plugin, suggested.version); await plugins.toggleInstall(plugin, suggested.version); - process.exit(0); - } catch (err) { + (process as any).exit(0); + } catch (err: any) { winston.error(`An error occurred during plugin installation\n${err.stack}`); - process.exit(1); + (process as any).exit(1); } } @@ -55,7 +57,7 @@ async function activate(plugin) { await reset.reset({ theme: plugin, }); - process.exit(); + (process as any).exit(); } try { await db.init(); @@ -73,11 +75,11 @@ async function activate(plugin) { const isActive = await plugins.isActive(plugin); if (isActive) { winston.info('Plugin `%s` already active', plugin); - process.exit(0); + (process as any).exit(0); } if (nconf.get('plugins:active')) { winston.error('Cannot activate plugins while plugin state configuration is set, please change your active configuration (config.json, environmental variables or terminal arguments) instead'); - process.exit(1); + (process as any).exit(1); } const numPlugins = await db.sortedSetCard('plugins:active'); winston.info('Activating plugin `%s`', plugin); @@ -87,10 +89,10 @@ async function activate(plugin) { text: plugin, }); - process.exit(0); - } catch (err) { + (process as any).exit(0); + } catch (err: any) { winston.error(`An error occurred during plugin activation\n${err.stack}`); - process.exit(1); + (process as any).exit(1); } } @@ -116,16 +118,16 @@ async function listPlugins() { combined.sort((a, b) => (a.id > b.id ? 1 : -1)); // Pretty output - process.stdout.write('Active plugins:\n'); + (process as any).stdout.write('Active plugins:\n'); combined.forEach((plugin) => { - process.stdout.write(`\t* ${plugin.id}${plugin.version ? `@${plugin.version}` : ''} (`); - process.stdout.write(plugin.installed ? chalk.green('installed') : chalk.red('not installed')); - process.stdout.write(', '); - process.stdout.write(plugin.active ? chalk.green('enabled') : chalk.yellow('disabled')); - process.stdout.write(')\n'); + (process as any).stdout.write(`\t* ${plugin.id}${plugin.version ? `@${plugin.version}` : ''} (`); + (process as any).stdout.write(plugin.installed ? chalk.green('installed') : chalk.red('not installed')); + (process as any).stdout.write(', '); + (process as any).stdout.write(plugin.active ? chalk.green('enabled') : chalk.yellow('disabled')); + (process as any).stdout.write(')\n'); }); - process.exit(); + (process as any).exit(); } async function listEvents(count = 10) { @@ -135,17 +137,16 @@ async function listEvents(count = 10) { eventData.forEach((event) => { console.log(` * ${chalk.green(String(event.timestampISO))} ${chalk.yellow(String(event.type))}${event.text ? ` ${event.text}` : ''} (uid: ${event.uid ? event.uid : 0})`); }); - process.exit(); + (process as any).exit(); } async function info() { console.log(''); - const { version } = require('../../package.json'); console.log(` version: ${version}`); - console.log(` Node ver: ${process.version}`); - - const hash = childProcess.execSync('git rev-parse HEAD'); + console.log(` Node ver: ${(process as any).version}`); + // @ts-ignore + const hash = child(process as any).execSync('git rev-parse HEAD'); console.log(` git hash: ${hash}`); console.log(` database: ${nconf.get('database')}`); @@ -182,28 +183,31 @@ async function info() { const max = Math.max(...analyticsData); analyticsData.forEach((point, idx) => { + // @ts-ignore graph.addPoint(idx + 1, Math.round(point / max * 10)); }); console.log(''); console.log(graph.toString()); console.log(`Pageviews, last 24h (min: ${min} max: ${max})`); - process.exit(); + (process as any).exit(); } -async function buildWrapper(targets, options) { +async function buildWrapper(targets, options?) { try { - await build.build(targets, options); - process.exit(0); - } catch (err) { + await build(targets, options); + (process as any).exit(0); + } catch (err: any) { winston.error(err.stack); - process.exit(1); + (process as any).exit(1); } } -exports.build = buildWrapper; -exports.install = install; -exports.activate = activate; -exports.listPlugins = listPlugins; -exports.listEvents = listEvents; -exports.info = info; +export default { + buildWrapper, + install, + activate, + listPlugins, + listEvents, + info +}; \ No newline at end of file diff --git a/src/cli/package-install.ts b/src/cli/package-install.ts index eea93e5d9e..8df2b181af 100644 --- a/src/cli/package-install.ts +++ b/src/cli/package-install.ts @@ -1,13 +1,15 @@ 'use strict'; -const path = require('path'); +import path from 'path'; +import fs from 'fs'; +import cproc from 'child_process'; +import { paths, pluginNamePattern } from '../constants'; +import nconf from 'nconf'; +import _ from 'lodash'; -const fs = require('fs'); -const cproc = require('child_process'); -const { paths, pluginNamePattern } = require('../constants'); -const pkgInstall = module.exports; +const pkgInstall = {} as any; function sortDependencies(dependencies) { return Object.entries(dependencies) @@ -23,8 +25,7 @@ pkgInstall.updatePackageFile = () => { try { oldPackageContents = JSON.parse(fs.readFileSync(paths.currentPackage, 'utf8')); - } catch (e) { - if (e.code !== 'ENOENT') { +} catch (e: any) { if (e.code !== 'ENOENT') { throw e; } else { // No local package.json, copy from install/package.json @@ -33,7 +34,6 @@ pkgInstall.updatePackageFile = () => { } } - const _ = require('lodash'); const defaultPackageContents = JSON.parse(fs.readFileSync(paths.installPackage, 'utf8')); let dependencies = {}; @@ -70,7 +70,6 @@ pkgInstall.getPackageManager = () => { return packageManager.groups.packageManager; } fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK); - const nconf = require('nconf'); if (!Object.keys(nconf.stores).length) { // Quick & dirty nconf setup for when you cannot rely on nconf having been required already const configFile = path.resolve(__dirname, '../../', nconf.any(['config', 'CONFIG']) || 'config.json'); @@ -87,8 +86,7 @@ pkgInstall.getPackageManager = () => { } return nconf.get('package_manager') || 'npm'; - } catch (e) { - // nconf not installed or other unexpected error/exception +} catch (e: any) { // nconf not installed or other unexpected error/exception return getPackageManagerByLockfile() || 'npm'; } }; @@ -103,10 +101,10 @@ function getPackageManagerByLockfile() { } pkgInstall.installAll = () => { - const prod = process.env.NODE_ENV !== 'development'; + const prod = (process as any).env.NODE_ENV !== 'development'; let command = 'npm install'; - const supportedPackageManagerList = exports.supportedPackageManager; // load config from src/cli/package-install.js + const supportedPackageManagerList = pkgInstall.supportedPackageManager; // load config from src/cli/package-install.js const packageManager = pkgInstall.getPackageManager(); if (supportedPackageManagerList.indexOf(packageManager) >= 0) { switch (packageManager) { @@ -130,7 +128,7 @@ pkgInstall.installAll = () => { cwd: path.join(__dirname, '../../'), stdio: [0, 1, 2], }); - } catch (e) { + } catch (e: any) { console.log('Error installing dependencies!'); console.log(`message: ${e.message}`); console.log(`stdout: ${e.stdout}`); @@ -143,8 +141,7 @@ pkgInstall.preserveExtraneousPlugins = () => { // Skip if `node_modules/` is not found or inaccessible try { fs.accessSync(paths.nodeModules, fs.constants.R_OK); - } catch (e) { - return; +} catch (e: any) { return; } const packages = fs.readdirSync(paths.nodeModules) @@ -172,3 +169,5 @@ pkgInstall.preserveExtraneousPlugins = () => { fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 4)); }; + +export default pkgInstall; \ No newline at end of file diff --git a/src/cli/reset.ts b/src/cli/reset.ts index a05519b101..398b14772f 100644 --- a/src/cli/reset.ts +++ b/src/cli/reset.ts @@ -1,20 +1,19 @@ 'use strict'; -const path = require('path'); -const winston = require('winston'); -const fs = require('fs'); -const chalk = require('chalk'); -const nconf = require('nconf'); +import path from 'path'; +import winston from 'winston'; +import fs from 'fs'; +import chalk from 'chalk'; +import nconf from 'nconf'; +import db from '../database'; +import events from '../events'; +import meta from '../meta'; +import plugins from '../plugins'; +import widgets from '../widgets'; +import privileges from '../privileges'; +import { paths, pluginNamePattern, themeNamePattern } from '../constants'; -const db = require('../database'); -const events = require('../events'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const widgets = require('../widgets'); -const privileges = require('../privileges'); -const { paths, pluginNamePattern, themeNamePattern } = require('../constants'); - -exports.reset = async function (options) { +export const reset = async function (options) { const map = { theme: async function () { let themeId = options.theme; @@ -71,7 +70,7 @@ exports.reset = async function (options) { ' Prefix is optional, e.g. ./nodebb reset -p markdown, ./nodebb reset -t harmony', ].join('\n')); - process.exit(0); + (process as any).exit(0); } try { @@ -81,10 +80,10 @@ exports.reset = async function (options) { await task(); } winston.info('[reset] Reset complete. Please run `./nodebb build` to rebuild assets.'); - process.exit(0); - } catch (err) { + (process as any).exit(0); + } catch (err: any) { winston.error(`[reset] Errors were encountered during reset -- ${err.message}`); - process.exit(1); + (process as any).exit(1); } }; @@ -97,7 +96,7 @@ async function resetSettings() { async function resetTheme(themeId) { try { await fs.promises.access(path.join(paths.nodeModules, themeId, 'package.json')); - } catch (err) { + } catch (err: any) { winston.warn('[reset] Theme `%s` is not installed on this forum', themeId); throw new Error('theme-not-found'); } @@ -117,11 +116,11 @@ async function resetThemeTo(themeId) { winston.info(`[reset] Theme reset to ${themeId} and default skin`); } -async function resetPlugin(pluginId) { +async function resetPlugin(pluginId?) { try { if (nconf.get('plugins:active')) { winston.error('Cannot reset plugins while plugin state is set in the configuration (config.json, environmental variables or terminal arguments), please modify the configuration instead'); - process.exit(1); + (process as any).exit(1); } const isActive = await db.isSortedSetMember('plugins:active', pluginId); if (isActive) { @@ -135,7 +134,7 @@ async function resetPlugin(pluginId) { winston.warn('[reset] Plugin `%s` was not active on this forum', pluginId); winston.info('[reset] No action taken.'); } - } catch (err) { + } catch (err: any) { winston.error(`[reset] Could not disable plugin: ${pluginId} encountered error %s\n${err.stack}`); throw err; } @@ -144,7 +143,7 @@ async function resetPlugin(pluginId) { async function resetPlugins() { if (nconf.get('plugins:active')) { winston.error('Cannot reset plugins while plugin state is set in the configuration (config.json, environmental variables or terminal arguments), please modify the configuration instead'); - process.exit(1); + (process as any).exit(1); } await db.delete('plugins:active'); winston.info('[reset] All Plugins De-activated'); diff --git a/src/cli/running.ts b/src/cli/running.ts index d52e6144e4..3d6ff57a0b 100644 --- a/src/cli/running.ts +++ b/src/cli/running.ts @@ -1,38 +1,35 @@ 'use strict'; -const fs = require('fs'); -const childProcess = require('child_process'); -const chalk = require('chalk'); - -const fork = require('../meta/debugFork'); -const { paths } = require('../constants'); +import fs from 'fs'; +import chalk from 'chalk'; +import fork from '../meta/debugFork'; +import { paths } from '../constants'; const cwd = paths.baseDir; -function getRunningPid(callback) { +export function getRunningPid(callback) { fs.readFile(paths.pidfile, { encoding: 'utf-8', - }, (err, pid) => { + }, (err, pid: number | string) => { if (err) { return callback(err); } - pid = parseInt(pid, 10); + pid = parseInt(pid as string, 10); try { - process.kill(pid, 0); + (process as any).kill(pid, 0); callback(null, pid); - } catch (e) { - callback(e); + } catch (e: any) { callback(e); } }); } -function start(options) { +export function start(options?) { if (options.dev) { - process.env.NODE_ENV = 'development'; + (process as any).env.NODE_ENV = 'development'; fork(paths.loader, ['--no-daemon', '--no-silent'], { - env: process.env, + env: (process as any).env, stdio: 'inherit', cwd, }); @@ -55,12 +52,13 @@ function start(options) { } // Spawn a new NodeBB process - const child = fork(paths.loader, process.argv.slice(3), { - env: process.env, + const child = fork(paths.loader, (process as any).argv.slice(3), { + env: (process as any).env, cwd, }); if (options.log) { - childProcess.spawn('tail', ['-F', './logs/output.log'], { + // @ts-ignore + child(process as any).spawn('tail', ['-F', './logs/output.log'], { stdio: 'inherit', cwd, }); @@ -69,10 +67,10 @@ function start(options) { return child; } -function stop() { +export function stop() { getRunningPid((err, pid) => { if (!err) { - process.kill(pid, 'SIGTERM'); + (process as any).kill(pid, 'SIGTERM'); console.log('Stopping NodeBB. Goodbye!'); } else { console.log('NodeBB is already stopped.'); @@ -84,7 +82,7 @@ function restart(options) { getRunningPid((err, pid) => { if (!err) { console.log(chalk.bold('\nRestarting NodeBB')); - process.kill(pid, 'SIGTERM'); + (process as any).kill(pid, 'SIGTERM'); options.silent = true; start(options); @@ -94,7 +92,7 @@ function restart(options) { }); } -function status() { +export function status() { getRunningPid((err, pid) => { if (!err) { console.log(`\n${[ @@ -110,16 +108,11 @@ function status() { }); } -function log() { +export function log() { console.log(`${chalk.red('\nHit ') + chalk.bold('Ctrl-C ') + chalk.red('to exit\n')}\n`); - childProcess.spawn('tail', ['-F', './logs/output.log'], { - stdio: 'inherit', - cwd, - }); + // child(process as any).spawn('tail', ['-F', './logs/output.log'], { + // stdio: 'inherit', + // cwd, + // }); } -exports.start = start; -exports.stop = stop; -exports.restart = restart; -exports.status = status; -exports.log = log; diff --git a/src/cli/setup.ts b/src/cli/setup.ts index 51245c9262..0f45e78577 100644 --- a/src/cli/setup.ts +++ b/src/cli/setup.ts @@ -1,17 +1,18 @@ 'use strict'; -const winston = require('winston'); -const path = require('path'); -const nconf = require('nconf'); +import winston from 'winston'; +import path from 'path'; +import nconf from 'nconf'; +import web from '../../install/web'; +import { paths } from '../constants'; +// import install from '../install'; +import * as build from '../meta/build'; +import * as prestart from '../prestart'; +//@ts-ignore +import pkg from '../../package.json'; -const { install } = require('../../install/web'); +async function setup(initConfig?) { -async function setup(initConfig) { - const { paths } = require('../constants'); - const install = require('../install'); - const build = require('../meta/build'); - const prestart = require('../prestart'); - const pkg = require('../../package.json'); winston.info('NodeBB Setup Triggered via Command Line'); @@ -19,8 +20,8 @@ async function setup(initConfig) { console.log('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.'); console.log('Press enter to accept the default setting (shown in brackets).'); - install.values = initConfig; - const data = await install.setup(); + web.values = initConfig; + const data = await web.setup(); let configFile = paths.config; if (nconf.get('config')) { configFile = path.resolve(paths.baseDir, nconf.get('config')); @@ -33,8 +34,8 @@ async function setup(initConfig) { } let separator = ' '; - if (process.stdout.columns > 10) { - for (let x = 0, cols = process.stdout.columns - 10; x < cols; x += 1) { + if ((process as any).stdout.columns > 10) { + for (let x = 0, cols = (process as any).stdout.columns - 10; x < cols; x += 1) { separator += '='; } } @@ -50,11 +51,15 @@ async function setup(initConfig) { // If I am a child process, notify the parent of the returned data before exiting (useful for notifying // hosts of auto-generated username/password during headless setups) - if (process.send) { - process.send(data); + if ((process as any).send) { + (process as any).send(data); } - process.exit(); + (process as any).exit(); } -exports.setup = setup; -exports.webInstall = install; +export default { + setup, + webInstall: web, +} + + diff --git a/src/cli/upgrade-plugins.ts b/src/cli/upgrade-plugins.ts index e789993388..fa18e0e6a8 100644 --- a/src/cli/upgrade-plugins.ts +++ b/src/cli/upgrade-plugins.ts @@ -1,30 +1,30 @@ 'use strict'; -const prompt = require('prompt'); -const request = require('request-promise-native'); -const cproc = require('child_process'); -const semver = require('semver'); -const fs = require('fs'); -const path = require('path'); -const chalk = require('chalk'); +import prompt from 'prompt'; +import request from 'request-promise-native'; +import cproc from 'child_process'; +import semver from 'semver'; +import fs from 'fs'; +import path from 'path'; +import chalk from 'chalk'; +import { paths, pluginNamePattern } from '../constants'; +import pkgInstall from './package-install'; +import * as batch from '../batch'; -const { paths, pluginNamePattern } = require('../constants'); -const pkgInstall = require('./package-install'); const packageManager = pkgInstall.getPackageManager(); let packageManagerExecutable = packageManager; const packageManagerInstallArgs = packageManager === 'yarn' ? ['add'] : ['install', '--save']; -if (process.platform === 'win32') { +if ((process as any).platform === 'win32') { packageManagerExecutable += '.cmd'; } async function getModuleVersions(modules) { const versionHash = {}; - const batch = require('../batch'); await batch.processArray(modules, async (moduleNames) => { await Promise.all(moduleNames.map(async (module) => { - let pkg = await fs.promises.readFile( + let pkg: any = await fs.promises.readFile( path.join(paths.nodeModules, module, 'package.json'), { encoding: 'utf-8' } ); pkg = JSON.parse(pkg); @@ -41,7 +41,7 @@ async function getInstalledPlugins() { let [deps, bundled] = await Promise.all([ fs.promises.readFile(paths.currentPackage, { encoding: 'utf-8' }), fs.promises.readFile(paths.installPackage, { encoding: 'utf-8' }), - ]); + ]) as [any, any]; deps = Object.keys(JSON.parse(deps).dependencies) .filter(pkgName => pluginNamePattern.test(pkgName)); @@ -59,8 +59,7 @@ async function getInstalledPlugins() { try { fs.accessSync(path.join(paths.nodeModules, pkgName, '.git')); return false; - } catch (e) { - return true; + } catch (e: any) { return true; } }); @@ -68,7 +67,7 @@ async function getInstalledPlugins() { } async function getCurrentVersion() { - let pkg = await fs.promises.readFile(paths.installPackage, { encoding: 'utf-8' }); + let pkg: any = await fs.promises.readFile(paths.installPackage, { encoding: 'utf-8' }); pkg = JSON.parse(pkg); return pkg.version; } @@ -86,7 +85,7 @@ async function getSuggestedModules(nbbVersion, toCheck) { } async function checkPlugins() { - process.stdout.write('Checking installed plugins and themes for updates... '); + (process as any).stdout.write('Checking installed plugins and themes for updates... '); const [plugins, nbbVersion] = await Promise.all([ getInstalledPlugins(), getCurrentVersion(), @@ -94,11 +93,11 @@ async function checkPlugins() { const toCheck = Object.keys(plugins); if (!toCheck.length) { - process.stdout.write(chalk.green(' OK')); + (process as any).stdout.write(chalk.green(' OK')); return []; // no extraneous plugins installed } const suggestedModules = await getSuggestedModules(nbbVersion, toCheck); - process.stdout.write(chalk.green(' OK')); + (process as any).stdout.write(chalk.green(' OK')); let current; let suggested; @@ -119,13 +118,13 @@ async function checkPlugins() { return upgradable; } -async function upgradePlugins() { +export const upgradePlugins = async function() { try { const found = await checkPlugins(); if (found && found.length) { - process.stdout.write(`\n\nA total of ${chalk.bold(String(found.length))} package(s) can be upgraded:\n\n`); + (process as any).stdout.write(`\n\nA total of ${chalk.bold(String(found.length))} package(s) can be upgraded:\n\n`); found.forEach((suggestObj) => { - process.stdout.write(`${chalk.yellow(' * ') + suggestObj.name} (${chalk.yellow(suggestObj.current)} -> ${chalk.green(suggestObj.suggested)})\n`); + (process as any).stdout.write(`${chalk.yellow(' * ') + suggestObj.name} (${chalk.yellow(suggestObj.current)} -> ${chalk.green(suggestObj.suggested)})\n`); }); } else { console.log(chalk.green('\nAll packages up-to-date!')); @@ -150,10 +149,9 @@ async function upgradePlugins() { } else { console.log(`${chalk.yellow('Package upgrades skipped')}. Check for upgrades at any time by running "${chalk.green('./nodebb upgrade -p')}".`); } - } catch (err) { + } catch (err: any) { console.log(`${chalk.yellow('Warning')}: An unexpected error occured when attempting to verify plugin upgradability`); throw err; } } -exports.upgradePlugins = upgradePlugins; diff --git a/src/cli/upgrade.ts b/src/cli/upgrade.ts index 5ad7e772e6..ade8516f55 100644 --- a/src/cli/upgrade.ts +++ b/src/cli/upgrade.ts @@ -1,10 +1,13 @@ 'use strict'; -const nconf = require('nconf'); -const chalk = require('chalk'); +import nconf from 'nconf'; +import chalk from 'chalk'; +import packageInstall from './package-install'; +import { upgradePlugins } from './upgrade-plugins'; +import db from '../database'; +import meta from '../meta'; +import Upgrade from '../upgrade'; -const packageInstall = require('./package-install'); -const { upgradePlugins } = require('./upgrade-plugins'); const steps = { package: { @@ -12,13 +15,13 @@ const steps = { handler: function () { packageInstall.updatePackageFile(); packageInstall.preserveExtraneousPlugins(); - process.stdout.write(chalk.green(' OK\n')); + (process as any).stdout.write(chalk.green(' OK\n')); }, }, install: { message: 'Bringing base dependencies up to date...', handler: function () { - process.stdout.write(chalk.green(' started\n')); + (process as any).stdout.write(chalk.green(' started\n')); packageInstall.installAll(); }, }, @@ -50,7 +53,7 @@ async function runSteps(tasks) { for (let i = 0; i < tasks.length; i++) { const step = steps[tasks[i]]; if (step && step.message && step.handler) { - process.stdout.write(`\n${chalk.bold(`${i + 1}. `)}${chalk.yellow(step.message)}`); + (process as any).stdout.write(`\n${chalk.bold(`${i + 1}. `)}${chalk.yellow(step.message)}`); /* eslint-disable-next-line */ await step.handler(); } @@ -58,19 +61,19 @@ async function runSteps(tasks) { const message = 'NodeBB Upgrade Complete!'; // some consoles will return undefined/zero columns, // so just use 2 spaces in upgrade script if we can't get our column count - const { columns } = process.stdout; + const { columns } = (process as any).stdout; const spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; console.log(`\n\n${spaces}${chalk.green.bold(message)}\n`); - process.exit(); - } catch (err) { + (process as any).exit(); + } catch (err: any) { console.error(`Error occurred during upgrade: ${err.stack}`); throw err; } } -async function runUpgrade(upgrades, options) { +async function runUpgrade(upgrades, options?) { console.log(chalk.cyan('\nUpdating NodeBB...')); options = options || {}; // disable mongo timeouts during upgrade @@ -86,10 +89,10 @@ async function runUpgrade(upgrades, options) { return; } - await require('../database').init(); - await require('../meta').configs.init(); - await require('../upgrade').runParticular(upgrades); - process.exit(0); + db.init(); + meta.configs.init(); + Upgrade.runParticular(upgrades); + (process as any).exit(0); } -exports.upgrade = runUpgrade; +export const upgrade = runUpgrade; diff --git a/src/cli/user.ts b/src/cli/user.ts index bbd747865f..657c4fcfbe 100644 --- a/src/cli/user.ts +++ b/src/cli/user.ts @@ -1,8 +1,22 @@ 'use strict'; -const { Command, Option } = require('commander'); +import user from '../user'; +import groups from '../groups'; +import privileges from '../privileges'; +import privHelpers from '../privileges/helpers'; +import utils from '../utils'; +import winston from 'winston'; +import * as webserver from '../webserver'; +const viewsDir = nconf.get('views_dir'); +import nconf from 'nconf'; +import Benchpress from 'benchpressjs'; +import meta from '../meta'; +import emailer from '../emailer'; +import db from '../database'; -module.exports = () => { +import { Command, Option } from 'commander'; + +export default () => { const userCmd = new Command('user') .description('Manage users') .arguments('[command]'); @@ -66,37 +80,21 @@ module.exports = () => { return userCmd; }; -let db; -let user; -let groups; -let privileges; -let privHelpers; -let utils; -let winston; - async function init() { - db = require('../database'); await db.init(); - - user = require('../user'); - groups = require('../groups'); - privileges = require('../privileges'); - privHelpers = require('../privileges/helpers'); - utils = require('../utils'); - winston = require('winston'); } async function execute(cmd, args) { await init(); try { await cmd(...args); - } catch (err) { + } catch (err: any) { const userError = err.name === 'UserError'; winston.error(`[userCmd/${cmd.name}] ${userError ? `${err.message}` : 'Command failed.'}`, userError ? '' : err); - process.exit(1); + (process as any).exit(1); } - process.exit(); + (process as any).exit(); } function UserCmdHelpers() { @@ -111,24 +109,17 @@ function UserCmdHelpers() { } async function setupApp() { - const nconf = require('nconf'); - const Benchpress = require('benchpressjs'); - - const meta = require('../meta'); await meta.configs.init(); - const webserver = require('../webserver'); - const viewsDir = nconf.get('views_dir'); webserver.app.engine('tpl', (filepath, data, next) => { filepath = filepath.replace(/\.tpl$/, '.js'); - Benchpress.__express(filepath, data, next); + (Benchpress as any).__express(filepath, data, next); }); webserver.app.set('view engine', 'tpl'); webserver.app.set('views', viewsDir); - const emailer = require('../emailer'); emailer.registerApp(webserver.app); } diff --git a/src/constants.ts b/src/constants.ts index cc563f1353..45543a045e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,17 +1,17 @@ 'use strict'; -const path = require('path'); +import path from 'path'; const baseDir = path.join(__dirname, '../'); -const loader = path.join(baseDir, 'loader.js'); +const loader = path.join(baseDir, '../loader.js'); const app = path.join(baseDir, 'app.js'); const pidfile = path.join(baseDir, 'pidfile'); -const config = path.join(baseDir, 'config.json'); -const currentPackage = path.join(baseDir, 'package.json'); +const config = path.join(baseDir, '../config.json'); +const currentPackage = path.join(baseDir, '../package.json'); const installPackage = path.join(baseDir, 'install/package.json'); -const nodeModules = path.join(baseDir, 'node_modules'); +const nodeModules = path.join(baseDir, '../node_modules'); -exports.paths = { +export const paths = { baseDir, loader, app, @@ -22,5 +22,5 @@ exports.paths = { nodeModules, }; -exports.pluginNamePattern = /^(@[\w-]+\/)?nodebb-(theme|plugin|widget|rewards)-[\w-]+$/; -exports.themeNamePattern = /^(@[\w-]+\/)?nodebb-theme-[\w-]+$/; +export const pluginNamePattern = /^(@[\w-]+\/)?nodebb-(theme|plugin|widget|rewards)-[\w-]+$/; +export const themeNamePattern = /^(@[\w-]+\/)?nodebb-theme-[\w-]+$/; diff --git a/src/controllers/404.ts b/src/controllers/404.ts index 3843d6bace..024627f025 100644 --- a/src/controllers/404.ts +++ b/src/controllers/404.ts @@ -1,15 +1,13 @@ -'use strict'; +'use strict' +import nconf from 'nconf'; +import winston from 'winston'; +import validator from 'validator'; +import meta from '../meta'; +import plugins from '../plugins'; +import middleware from '../middleware'; +import helpers from '../middleware/helpers'; -const nconf = require('nconf'); -const winston = require('winston'); -const validator = require('validator'); - -const meta = require('../meta'); -const plugins = require('../plugins'); -const middleware = require('../middleware'); -const helpers = require('../middleware/helpers'); - -exports.handle404 = function handle404(req, res) { +export const handle404 = function handle404(req, res) { const relativePath = nconf.get('relative_path'); const isClientScript = new RegExp(`^${relativePath}\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$`); @@ -33,18 +31,18 @@ exports.handle404 = function handle404(req, res) { meta.errors.log404(req.path || ''); res.sendStatus(404); } else if (req.accepts('html')) { - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { winston.warn(`Route requested but not found: ${req.url}`); } meta.errors.log404(req.path.replace(/^\/api/, '') || ''); - exports.send404(req, res); + send404(req, res); } else { res.status(404).type('txt').send('Not found'); } }; -exports.send404 = async function (req, res) { +export const send404 = async function (req, res) { res.status(404); const path = String(req.path || ''); if (res.locals.isAPI) { diff --git a/src/controllers/accounts.ts b/src/controllers/accounts.ts index eb2911dce3..bd2624322f 100644 --- a/src/controllers/accounts.ts +++ b/src/controllers/accounts.ts @@ -1,20 +1,35 @@ 'use strict'; +import profile from './accounts/profile'; +import edit from './accounts/edit'; +import info from './accounts/info'; +import categories from './accounts/categories'; +import settings from './accounts/settings'; +import groups from './accounts/groups'; +import follow from './accounts/follow'; +import posts from './accounts/posts'; +import notifications from './accounts/notifications'; +import chats from './accounts/chats'; +import sessions from './accounts/sessions'; +import blocks from './accounts/blocks'; +import uploads from './accounts/uploads'; +import consent from './accounts/consent'; + const accountsController = { - profile: require('./accounts/profile'), - edit: require('./accounts/edit'), - info: require('./accounts/info'), - categories: require('./accounts/categories'), - settings: require('./accounts/settings'), - groups: require('./accounts/groups'), - follow: require('./accounts/follow'), - posts: require('./accounts/posts'), - notifications: require('./accounts/notifications'), - chats: require('./accounts/chats'), - sessions: require('./accounts/sessions'), - blocks: require('./accounts/blocks'), - uploads: require('./accounts/uploads'), - consent: require('./accounts/consent'), + profile, + edit, + info, + categories, + settings, + groups, + follow, + posts, + notifications, + chats, + sessions, + blocks, + uploads, + consent, }; -module.exports = accountsController; +export default accountsController; diff --git a/src/controllers/accounts/blocks.ts b/src/controllers/accounts/blocks.ts index 12962e1027..9f03ad15df 100644 --- a/src/controllers/accounts/blocks.ts +++ b/src/controllers/accounts/blocks.ts @@ -1,12 +1,12 @@ 'use strict'; -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); -const pagination = require('../../pagination'); -const user = require('../../user'); -const plugins = require('../../plugins'); +import helpers from '../helpers'; +import accountHelpers from './helpers'; +import pagination from '../../pagination'; +import user from '../../user'; +import plugins from '../../plugins'; -const blocksController = module.exports; +const blocksController = {} as any; blocksController.getBlocks = async function (req, res, next) { const page = parseInt(req.query.page, 10) || 1; @@ -37,3 +37,5 @@ blocksController.getBlocks = async function (req, res, next) { res.render('account/blocks', userData); }; + +export default blocksController; \ No newline at end of file diff --git a/src/controllers/accounts/categories.ts b/src/controllers/accounts/categories.ts index a5cd86c9d5..9016acfdd1 100644 --- a/src/controllers/accounts/categories.ts +++ b/src/controllers/accounts/categories.ts @@ -1,13 +1,13 @@ 'use strict'; -const user = require('../../user'); -const categories = require('../../categories'); -const accountHelpers = require('./helpers'); -const helpers = require('../helpers'); -const pagination = require('../../pagination'); -const meta = require('../../meta'); +import user from '../../user'; +import categories from '../../categories'; +import accountHelpers from './helpers'; +import helpers from '../helpers'; +import pagination from '../../pagination'; +import meta from '../../meta'; -const categoriesController = module.exports; +const categoriesController = {} as any; categoriesController.get = async function (req, res, next) { const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); @@ -42,3 +42,5 @@ categoriesController.get = async function (req, res, next) { userData.pagination = pagination.create(page, pageCount, req.query); res.render('account/categories', userData); }; + +export default categoriesController; \ No newline at end of file diff --git a/src/controllers/accounts/chats.ts b/src/controllers/accounts/chats.ts index 9efd537813..e06673859d 100644 --- a/src/controllers/accounts/chats.ts +++ b/src/controllers/accounts/chats.ts @@ -1,12 +1,12 @@ 'use strict'; -const messaging = require('../../messaging'); -const meta = require('../../meta'); -const user = require('../../user'); -const privileges = require('../../privileges'); -const helpers = require('../helpers'); +import messaging from '../../messaging'; +import meta from '../../meta'; +import user from '../../user'; +import privileges from '../../privileges'; +import helpers from '../helpers'; -const chatsController = module.exports; +const chatsController = {} as any; chatsController.get = async function (req, res, next) { if (meta.config.disableChat) { @@ -63,3 +63,5 @@ chatsController.redirectToChat = async function (req, res, next) { const roomid = parseInt(req.params.roomid, 10); helpers.redirect(res, `/user/${userslug}/chats${roomid ? `/${roomid}` : ''}`); }; + +export default chatsController; \ No newline at end of file diff --git a/src/controllers/accounts/consent.ts b/src/controllers/accounts/consent.ts index a4b5cd02c9..1ed87ab38f 100644 --- a/src/controllers/accounts/consent.ts +++ b/src/controllers/accounts/consent.ts @@ -1,11 +1,11 @@ 'use strict'; -const db = require('../../database'); -const meta = require('../../meta'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); +import db from '../../database'; +import meta from '../../meta'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; -const consentController = module.exports; +const consentController = {} as any; consentController.get = async function (req, res, next) { if (!meta.config.gdpr_enabled) { @@ -28,3 +28,5 @@ consentController.get = async function (req, res, next) { res.render('account/consent', userData); }; + +export default consentController; \ No newline at end of file diff --git a/src/controllers/accounts/edit.ts b/src/controllers/accounts/edit.ts index 7bbe27cebf..3814abfa36 100644 --- a/src/controllers/accounts/edit.ts +++ b/src/controllers/accounts/edit.ts @@ -1,14 +1,14 @@ 'use strict'; -const user = require('../../user'); -const meta = require('../../meta'); -const helpers = require('../helpers'); -const groups = require('../../groups'); -const accountHelpers = require('./helpers'); -const privileges = require('../../privileges'); -const file = require('../../file'); +import user from '../../user'; +import meta from '../../meta'; +import helpers from '../helpers'; +import groups from '../../groups'; +import accountHelpers from './helpers'; +import privileges from '../../privileges'; +import file from '../../file'; -const editController = module.exports; +const editController = {} as any; editController.get = async function (req, res, next) { const [userData, canUseSignature] = await Promise.all([ @@ -100,7 +100,7 @@ editController.email = async function (req, res, next) { }; async function renderRoute(name, req, res, next) { - const userData = await getUserData(req, next); + const userData = await getUserData(req); if (!userData) { return next(); } @@ -161,9 +161,11 @@ editController.uploadPicture = async function (req, res, next) { name: userPhoto.name, url: image.url, }]); - } catch (err) { + } catch (err: any) { next(err); } finally { await file.delete(userPhoto.path); } }; + +export default editController; \ No newline at end of file diff --git a/src/controllers/accounts/follow.ts b/src/controllers/accounts/follow.ts index 82b23cb2f9..3b2d3c8e82 100644 --- a/src/controllers/accounts/follow.ts +++ b/src/controllers/accounts/follow.ts @@ -1,11 +1,11 @@ 'use strict'; -const user = require('../../user'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); -const pagination = require('../../pagination'); +import user from '../../user'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; +import pagination from '../../pagination'; -const followController = module.exports; +const followController = {} as any; followController.getFollowing = async function (req, res, next) { await getFollow('account/following', 'following', req, res, next); @@ -39,3 +39,5 @@ async function getFollow(tpl, name, req, res, next) { res.render(tpl, userData); } + +export default followController; \ No newline at end of file diff --git a/src/controllers/accounts/groups.ts b/src/controllers/accounts/groups.ts index 7d2f03cbf3..14526218b3 100644 --- a/src/controllers/accounts/groups.ts +++ b/src/controllers/accounts/groups.ts @@ -1,10 +1,10 @@ 'use strict'; -const groups = require('../../groups'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); +import groups from '../../groups'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; -const groupsController = module.exports; +const groupsController = {} as any; groupsController.get = async function (req, res, next) { const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); @@ -23,3 +23,5 @@ groupsController.get = async function (req, res, next) { userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[global:header.groups]]' }]); res.render('account/groups', userData); }; + +export default groupsController; \ No newline at end of file diff --git a/src/controllers/accounts/helpers.ts b/src/controllers/accounts/helpers.ts index a0c0a0608c..3e2acd33cd 100644 --- a/src/controllers/accounts/helpers.ts +++ b/src/controllers/accounts/helpers.ts @@ -1,20 +1,22 @@ 'use strict'; -const validator = require('validator'); -const nconf = require('nconf'); +import validator from 'validator'; +import nconf from 'nconf'; +import db from '../../database'; +import user from '../../user'; +import groups from '../../groups'; +import plugins from '../../plugins'; +import meta from '../../meta'; +import utils from '../../utils'; +import privileges from '../../privileges'; +import translator from '../../translator'; +import messaging from '../../messaging'; +import categories from '../../categories'; +import promisify from '../../promisify'; -const db = require('../../database'); -const user = require('../../user'); -const groups = require('../../groups'); -const plugins = require('../../plugins'); -const meta = require('../../meta'); -const utils = require('../../utils'); -const privileges = require('../../privileges'); -const translator = require('../../translator'); -const messaging = require('../../messaging'); -const categories = require('../../categories'); -const helpers = module.exports; + +const helpers = {} as any; helpers.getUserDataByUserSlug = async function (userslug, callerUID, query = {}) { const uid = await user.getUidByUserslug(userslug); @@ -109,7 +111,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID, query = {}) if (userData['cover:url']) { userData['cover:url'] = userData['cover:url'].startsWith('http') ? userData['cover:url'] : (nconf.get('relative_path') + userData['cover:url']); } else { - userData['cover:url'] = require('../../coverPhoto').getDefaultProfileCover(userData.uid); + userData['cover:url'] = require('../../coverPhoto').default.getDefaultProfileCover(userData.uid); } userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%')); @@ -160,7 +162,7 @@ async function getCounts(userData, callerUID) { best: Promise.all(cids.map(async c => db.sortedSetCount(`cid:${c}:uid:${uid}:pids:votes`, 1, '+inf'))), controversial: Promise.all(cids.map(async c => db.sortedSetCount(`cid:${c}:uid:${uid}:pids:votes`, '-inf', -1))), topics: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:tids`)), - }; + } as any; if (userData.isAdmin || userData.isSelf) { promises.ignored = db.sortedSetCard(`uid:${uid}:ignored_tids`); promises.watched = db.sortedSetCard(`uid:${uid}:followed_tids`); @@ -267,4 +269,6 @@ function filterLinks(links, states) { }); } -require('../../promisify')(helpers); +promisify(helpers); + +export default helpers; \ No newline at end of file diff --git a/src/controllers/accounts/info.ts b/src/controllers/accounts/info.ts index 950b74945d..3e036b71fb 100644 --- a/src/controllers/accounts/info.ts +++ b/src/controllers/accounts/info.ts @@ -1,12 +1,12 @@ 'use strict'; -const db = require('../../database'); -const user = require('../../user'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); -const pagination = require('../../pagination'); +import db from '../../database'; +import user from '../../user'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; +import pagination from '../../pagination'; -const infoController = module.exports; +const infoController = {} as any; infoController.get = async function (req, res, next) { const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); @@ -52,3 +52,5 @@ async function getNotes(userData, start, stop) { ]); return { notes: notes, count: count }; } + +export default infoController; \ No newline at end of file diff --git a/src/controllers/accounts/notifications.ts b/src/controllers/accounts/notifications.ts index 75c501b1ce..34979859fe 100644 --- a/src/controllers/accounts/notifications.ts +++ b/src/controllers/accounts/notifications.ts @@ -1,11 +1,11 @@ 'use strict'; -const user = require('../../user'); -const helpers = require('../helpers'); -const plugins = require('../../plugins'); -const pagination = require('../../pagination'); +import user from '../../user'; +import helpers from '../helpers'; +import plugins from '../../plugins'; +import pagination from '../../pagination'; -const notificationsController = module.exports; +const notificationsController = {} as any; notificationsController.get = async function (req, res, next) { const regularFilters = [ @@ -70,3 +70,5 @@ notificationsController.get = async function (req, res, next) { breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[pages:notifications]]' }]), }); }; + +export default notificationsController; \ No newline at end of file diff --git a/src/controllers/accounts/posts.ts b/src/controllers/accounts/posts.ts index 94bc2d9169..3cb2025789 100644 --- a/src/controllers/accounts/posts.ts +++ b/src/controllers/accounts/posts.ts @@ -1,18 +1,18 @@ 'use strict'; -const db = require('../../database'); -const user = require('../../user'); -const posts = require('../../posts'); -const topics = require('../../topics'); -const categories = require('../../categories'); -const privileges = require('../../privileges'); -const pagination = require('../../pagination'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); -const plugins = require('../../plugins'); -const utils = require('../../utils'); +import db from '../../database'; +import user from '../../user'; +import posts from '../../posts'; +import topics from '../../topics'; +import categories from '../../categories'; +import privileges from '../../privileges'; +import pagination from '../../pagination'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; +import plugins from '../../plugins'; +import utils from '../../utils'; -const postsController = module.exports; +const postsController = {} as any; const templateToData = { 'account/bookmarks': { @@ -252,3 +252,5 @@ async function getItemCount(sets, data, settings) { } return await db.sortedSetsCardSum(sets); } + +export default postsController; \ No newline at end of file diff --git a/src/controllers/accounts/profile.ts b/src/controllers/accounts/profile.ts index 0401f5b31e..6d4753c5c8 100644 --- a/src/controllers/accounts/profile.ts +++ b/src/controllers/accounts/profile.ts @@ -1,20 +1,19 @@ 'use strict'; -const nconf = require('nconf'); -const _ = require('lodash'); +import nconf from 'nconf'; +import _ from 'lodash'; +import db from '../../database'; +import user from '../../user'; +import posts from '../../posts'; +import categories from '../../categories'; +import plugins from '../../plugins'; +import meta from '../../meta'; +import privileges from '../../privileges'; +import accountHelpers from './helpers'; +import helpers from '../helpers'; +import utils from '../../utils'; -const db = require('../../database'); -const user = require('../../user'); -const posts = require('../../posts'); -const categories = require('../../categories'); -const plugins = require('../../plugins'); -const meta = require('../../meta'); -const privileges = require('../../privileges'); -const accountHelpers = require('./helpers'); -const helpers = require('../helpers'); -const utils = require('../../utils'); - -const profileController = module.exports; +const profileController = {} as any; profileController.get = async function (req, res, next) { const lowercaseSlug = req.params.userslug.toLowerCase(); @@ -164,3 +163,5 @@ function addMetaTags(res, userData) { ); } } + +export default profileController; \ No newline at end of file diff --git a/src/controllers/accounts/sessions.ts b/src/controllers/accounts/sessions.ts index c1713d3d62..1170e30e8d 100644 --- a/src/controllers/accounts/sessions.ts +++ b/src/controllers/accounts/sessions.ts @@ -1,10 +1,10 @@ 'use strict'; -const user = require('../../user'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); +import user from '../../user'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; -const sessionController = module.exports; +const sessionController = {} as any; sessionController.get = async function (req, res, next) { const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); @@ -18,3 +18,5 @@ sessionController.get = async function (req, res, next) { res.render('account/sessions', userData); }; + +export default sessionController; diff --git a/src/controllers/accounts/settings.ts b/src/controllers/accounts/settings.ts index d7c6b3d45c..f07d5f2a88 100644 --- a/src/controllers/accounts/settings.ts +++ b/src/controllers/accounts/settings.ts @@ -1,21 +1,20 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); -const _ = require('lodash'); -const jwt = require('jsonwebtoken'); -const util = require('util'); +import nconf from 'nconf'; +import winston from 'winston'; +import _ from 'lodash'; +import jwt from 'jsonwebtoken'; +import util from 'util'; +import user from '../../user'; +import languages from '../../languages'; +import meta from '../../meta'; +import plugins from '../../plugins'; +import notifications from '../../notifications'; +import db from '../../database'; +import helpers from '../helpers'; +import accountHelpers from './helpers'; -const user = require('../../user'); -const languages = require('../../languages'); -const meta = require('../../meta'); -const plugins = require('../../plugins'); -const notifications = require('../../notifications'); -const db = require('../../database'); -const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); - -const settingsController = module.exports; +const settingsController = {} as any; settingsController.get = async function (req, res, next) { const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); @@ -129,7 +128,7 @@ const doUnsubscribe = async (payload) => { settingsController.unsubscribe = async (req, res) => { try { - const payload = await jwtVerifyAsync(req.params.token); + const payload: any = await jwtVerifyAsync(req.params.token); if (!payload || !unsubscribable.includes(payload.template)) { return; } @@ -137,7 +136,7 @@ settingsController.unsubscribe = async (req, res) => { res.render('unsubscribe', { payload, }); - } catch (err) { + } catch (err: any) { res.render('unsubscribe', { error: err.message, }); @@ -151,13 +150,13 @@ settingsController.unsubscribePost = async function (req, res) { if (!payload || !unsubscribable.includes(payload.template)) { return res.sendStatus(404); } - } catch (err) { + } catch (err: any) { return res.sendStatus(403); } try { await doUnsubscribe(payload); res.sendStatus(200); - } catch (err) { + } catch (err: any) { winston.error(`[settings/unsubscribe] One-click unsubscribe failed with error: ${err.message}`); res.sendStatus(500); } @@ -227,3 +226,5 @@ async function getHomePageRoutes(userData) { return routes; } + +export default settingsController; \ No newline at end of file diff --git a/src/controllers/accounts/uploads.ts b/src/controllers/accounts/uploads.ts index b8afa0d1fe..f8d4b527cc 100644 --- a/src/controllers/accounts/uploads.ts +++ b/src/controllers/accounts/uploads.ts @@ -1,16 +1,14 @@ 'use strict'; -const path = require('path'); +import path from 'path'; +import nconf from 'nconf'; +import db from '../../database'; +import helpers from '../helpers'; +import meta from '../../meta'; +import pagination from '../../pagination'; +import accountHelpers from './helpers'; -const nconf = require('nconf'); - -const db = require('../../database'); -const helpers = require('../helpers'); -const meta = require('../../meta'); -const pagination = require('../../pagination'); -const accountHelpers = require('./helpers'); - -const uploadsController = module.exports; +const uploadsController = {} as any; uploadsController.get = async function (req, res, next) { const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); @@ -38,3 +36,5 @@ uploadsController.get = async function (req, res, next) { userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[global:uploads]]' }]); res.render('account/uploads', userData); }; + +export default uploadsController; \ No newline at end of file diff --git a/src/controllers/admin.ts b/src/controllers/admin.ts index c56c8f2ed8..b4be8a642b 100644 --- a/src/controllers/admin.ts +++ b/src/controllers/admin.ts @@ -1,35 +1,52 @@ 'use strict'; -const privileges = require('../privileges'); -const helpers = require('./helpers'); +import privileges from '../privileges'; +import helpers from './helpers'; +import dashboard from './admin/dashboard'; +import categories from './admin/categories'; +import adminPrivileges from './admin/privileges'; +import adminsMods from './admin/admins-mods'; +import tags from './admin/tags'; +import groups from './admin/groups'; +import digest from './admin/digest'; +import appearance from './admin/appearance'; +import widgets from './admin/widgets'; +import rewards from './admin/rewards'; +import events from './admin/events'; +import hooks from './admin/hooks'; +import logs from './admin/logs'; +import errors from './admin/errors'; +import database from './admin/database'; +import cache from './admin/cache'; +import plugins from './admin/plugins'; +import settings from './admin/settings'; +import logger from './admin/logger'; +import themes from './admin/themes'; +import users from './admin/users'; +import uploads from './admin/uploads'; +import info from './admin/info'; const adminController = { - dashboard: require('./admin/dashboard'), - categories: require('./admin/categories'), - privileges: require('./admin/privileges'), - adminsMods: require('./admin/admins-mods'), - tags: require('./admin/tags'), - groups: require('./admin/groups'), - digest: require('./admin/digest'), - appearance: require('./admin/appearance'), - extend: { - widgets: require('./admin/widgets'), - rewards: require('./admin/rewards'), - }, - events: require('./admin/events'), - hooks: require('./admin/hooks'), - logs: require('./admin/logs'), - errors: require('./admin/errors'), - database: require('./admin/database'), - cache: require('./admin/cache'), - plugins: require('./admin/plugins'), - settings: require('./admin/settings'), - logger: require('./admin/logger'), - themes: require('./admin/themes'), - users: require('./admin/users'), - uploads: require('./admin/uploads'), - info: require('./admin/info'), -}; + dashboard, + categories, + privileges, + adminsMods, + groups, + digest, + appearance, + events, + hooks, + errors, + database, + plugins, + adminPrivileges, + settings, + logger, + themes, + users, + uploads, + info, +} as any; adminController.routeIndex = async (req, res) => { const privilegeSet = await privileges.admin.get(req.uid); @@ -55,4 +72,4 @@ adminController.routeIndex = async (req, res) => { return helpers.notAllowed(req, res); }; -module.exports = adminController; +export default adminController; diff --git a/src/controllers/admin/admins-mods.ts b/src/controllers/admin/admins-mods.ts index 9d06044acd..7d9f52e59d 100644 --- a/src/controllers/admin/admins-mods.ts +++ b/src/controllers/admin/admins-mods.ts @@ -1,16 +1,15 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../../database'; +import groups from '../../groups'; +import categories from '../../categories'; +import user from '../../user'; +import meta from '../../meta'; +import pagination from '../../pagination'; +import categoriesController from './categories'; -const db = require('../../database'); -const groups = require('../../groups'); -const categories = require('../../categories'); -const user = require('../../user'); -const meta = require('../../meta'); -const pagination = require('../../pagination'); -const categoriesController = require('./categories'); - -const AdminsMods = module.exports; +const AdminsMods = {} as any; AdminsMods.get = async function (req, res) { const rootCid = parseInt(req.query.cid, 10) || 0; @@ -59,3 +58,5 @@ async function getModeratorsOfCategories(categoryData) { }); return categoryData; } + +export default AdminsMods; \ No newline at end of file diff --git a/src/controllers/admin/appearance.ts b/src/controllers/admin/appearance.ts index 5bcfa5321e..325a25554f 100644 --- a/src/controllers/admin/appearance.ts +++ b/src/controllers/admin/appearance.ts @@ -1,9 +1,11 @@ 'use strict'; -const appearanceController = module.exports; +const appearanceController = {} as any; appearanceController.get = function (req, res) { const term = req.params.term ? req.params.term : 'themes'; res.render(`admin/appearance/${term}`, {}); }; + +export default appearanceController; diff --git a/src/controllers/admin/cache.ts b/src/controllers/admin/cache.ts index 6d5c385a22..d8b05b84c6 100644 --- a/src/controllers/admin/cache.ts +++ b/src/controllers/admin/cache.ts @@ -1,16 +1,15 @@ 'use strict'; -const cacheController = module.exports; +const cacheController = {} as any; -const utils = require('../../utils'); -const plugins = require('../../plugins'); +import utils from '../../utils'; +import plugins from '../../plugins'; +import postCache from '../../posts/cache'; +import group from '../../groups'; +import db from '../../database'; +import localCache from '../../cache'; cacheController.get = async function (req, res) { - const postCache = require('../../posts/cache'); - const groupCache = require('../../groups').cache; - const { objectCache } = require('../../database'); - const localCache = require('../../cache'); - function getInfo(cache) { return { length: cache.length, @@ -29,11 +28,11 @@ cacheController.get = async function (req, res) { } let caches = { post: postCache, - group: groupCache, + group: group.groupCache, local: localCache, - }; - if (objectCache) { - caches.object = objectCache; + } as any; + if (db.objectCache) { + caches.object = db.objectCache; } caches = await plugins.hooks.fire('filter:admin.cache.get', caches); for (const [key, value] of Object.entries(caches)) { @@ -45,10 +44,10 @@ cacheController.get = async function (req, res) { cacheController.dump = async function (req, res, next) { let caches = { - post: require('../../posts/cache'), - object: require('../../database').objectCache, - group: require('../../groups').cache, - local: require('../../cache'), + post: postCache, + object: db.objectCache, + group: group.groupCache, + local: localCache, }; caches = await plugins.hooks.fire('filter:admin.cache.get', caches); if (!caches[req.query.name]) { @@ -65,3 +64,5 @@ cacheController.dump = async function (req, res, next) { res.end(); }); }; + +export default cacheController; \ No newline at end of file diff --git a/src/controllers/admin/categories.ts b/src/controllers/admin/categories.ts index d901e65f0f..9d5609ce2f 100644 --- a/src/controllers/admin/categories.ts +++ b/src/controllers/admin/categories.ts @@ -1,16 +1,16 @@ 'use strict'; -const _ = require('lodash'); -const nconf = require('nconf'); -const categories = require('../../categories'); -const analytics = require('../../analytics'); -const plugins = require('../../plugins'); -const translator = require('../../translator'); -const meta = require('../../meta'); -const helpers = require('../helpers'); -const pagination = require('../../pagination'); +import _ from 'lodash'; +import nconf from 'nconf'; +import categories from '../../categories'; +import analytics from '../../analytics'; +import plugins from '../../plugins'; +import translator from '../../translator'; +import meta from '../../meta'; +import helpers from '../helpers'; +import pagination from '../../pagination'; -const categoriesController = module.exports; +const categoriesController = {} as any; categoriesController.get = async function (req, res, next) { const [categoryData, parent, selectedData] = await Promise.all([ @@ -141,3 +141,5 @@ categoriesController.getAnalytics = async function (req, res) { analytics: analyticsData, }); }; + +export default categoriesController; \ No newline at end of file diff --git a/src/controllers/admin/dashboard.ts b/src/controllers/admin/dashboard.ts index ac9f4fc130..a83fbea3ef 100644 --- a/src/controllers/admin/dashboard.ts +++ b/src/controllers/admin/dashboard.ts @@ -1,22 +1,22 @@ 'use strict'; +import nconf from 'nconf'; +import semver from 'semver'; +import winston from 'winston'; +import _ from 'lodash'; +import validator from 'validator'; +import * as versions from '../../admin/versions'; +import db from '../../database'; +import meta from '../../meta'; +import analytics from '../../analytics'; +import plugins from '../../plugins'; +import user from '../../user'; +import topics from '../../topics'; +import utils from '../../utils'; +import emailer from '../../emailer'; +import cache from '../../cache'; -const nconf = require('nconf'); -const semver = require('semver'); -const winston = require('winston'); -const _ = require('lodash'); -const validator = require('validator'); -const versions = require('../../admin/versions'); -const db = require('../../database'); -const meta = require('../../meta'); -const analytics = require('../../analytics'); -const plugins = require('../../plugins'); -const user = require('../../user'); -const topics = require('../../topics'); -const utils = require('../../utils'); -const emailer = require('../../emailer'); - -const dashboardController = module.exports; +const dashboardController = {} as any; dashboardController.get = async function (req, res) { const [stats, notices, latestVersion, lastrestart, isAdmin, popularSearches] = await Promise.all([ @@ -34,10 +34,11 @@ dashboardController.get = async function (req, res) { lookupFailed: latestVersion === null, latestVersion: latestVersion, upgradeAvailable: latestVersion && semver.gt(latestVersion, version), + // @ts-ignore currentPrerelease: versions.isPrerelease.test(version), notices: notices, stats: stats, - canRestart: !!process.send, + canRestart: !!(process as any).send, lastrestart: lastrestart, showSystemControls: isAdmin, popularSearches: popularSearches, @@ -58,7 +59,7 @@ async function getNotices() { tooltip: '[[admin/dashboard:search-plugin-tooltip]]', link: '/admin/extend/plugins', }, - ]; + ] as any[]; if (emailer.fallbackNotFound) { notices.push({ @@ -67,7 +68,7 @@ async function getNotices() { }); } - if (global.env !== 'production') { + if ((global as any).env !== 'production') { notices.push({ done: false, notDoneText: '[[admin/dashboard:running-in-development]]', @@ -79,8 +80,9 @@ async function getNotices() { async function getLatestVersion() { try { + // @ts-ignore return await versions.getLatestVersion(); - } catch (err) { + } catch (err: any) { winston.error(`[acp] Failed to fetch latest version\n${err.stack}`); } return null; @@ -92,7 +94,7 @@ dashboardController.getAnalytics = async (req, res, next) => { const validSets = ['uniquevisitors', 'pageviews', 'pageviews:registered', 'pageviews:bot', 'pageviews:guest']; const until = req.query.until ? new Date(parseInt(req.query.until, 10)) : Date.now(); const count = req.query.count || (req.query.units === 'hours' ? 24 : 30); - if (isNaN(until) || !validUnits.includes(req.query.units)) { + if (isNaN(until as number) || !validUnits.includes(req.query.units)) { return next(new Error('[[error:invalid-data]]')); } @@ -121,7 +123,6 @@ dashboardController.getAnalytics = async (req, res, next) => { }; async function getStats() { - const cache = require('../../cache'); const cachedStats = cache.get('admin:stats'); if (cachedStats !== undefined) { return cachedStats; @@ -342,3 +343,5 @@ dashboardController.getSearches = async (req, res) => { searches: searches.map(s => ({ value: validator.escape(String(s.value)), score: s.score })), }); }; + +export default dashboardController; \ No newline at end of file diff --git a/src/controllers/admin/database.ts b/src/controllers/admin/database.ts index 759002ad6e..6ffbed96d5 100644 --- a/src/controllers/admin/database.ts +++ b/src/controllers/admin/database.ts @@ -1,23 +1,27 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import rdb from '../../database/redis'; +import mdb from '../../database/mongo'; +import pdb from '../../database/postgres'; -const databaseController = module.exports; + + +const databaseController = {} as any; databaseController.get = async function (req, res) { - const results = {}; + const results = {} as any; if (nconf.get('redis')) { - const rdb = require('../../database/redis'); results.redis = await rdb.info(rdb.client); } if (nconf.get('mongo')) { - const mdb = require('../../database/mongo'); results.mongo = await mdb.info(mdb.client); } if (nconf.get('postgres')) { - const pdb = require('../../database/postgres'); results.postgres = await pdb.info(pdb.pool); } res.render('admin/advanced/database', results); }; + +export default databaseController; \ No newline at end of file diff --git a/src/controllers/admin/digest.ts b/src/controllers/admin/digest.ts index 48eddcddcf..8dd43e5f77 100644 --- a/src/controllers/admin/digest.ts +++ b/src/controllers/admin/digest.ts @@ -1,10 +1,10 @@ 'use strict'; -const meta = require('../../meta'); -const digest = require('../../user/digest'); -const pagination = require('../../pagination'); +import meta from '../../meta'; +import digest from '../../user/digest'; +import pagination from '../../pagination'; -const digestController = module.exports; +const digestController = {} as any; digestController.get = async function (req, res) { const page = parseInt(req.query.page, 10) || 1; @@ -21,3 +21,5 @@ digestController.get = async function (req, res) { pagination: pagination.create(page, pageCount), }); }; + +export default digestController; \ No newline at end of file diff --git a/src/controllers/admin/errors.ts b/src/controllers/admin/errors.ts index f609ecca3d..a911f92c67 100644 --- a/src/controllers/admin/errors.ts +++ b/src/controllers/admin/errors.ts @@ -1,12 +1,11 @@ 'use strict'; -const json2csvAsync = require('json2csv').parseAsync; +import { parseAsync as json2csvAsync } from 'json2csv'; +import meta from '../../meta'; +import analytics from '../../analytics'; +import utils from '../../utils'; -const meta = require('../../meta'); -const analytics = require('../../analytics'); -const utils = require('../../utils'); - -const errorsController = module.exports; +const errorsController = {} as any; errorsController.get = async function (req, res) { const data = await utils.promiseParallel({ @@ -23,3 +22,5 @@ errorsController.export = async function (req, res) { const csv = await json2csvAsync(data, opts); res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="404.csv"').send(csv); }; + +export default errorsController; \ No newline at end of file diff --git a/src/controllers/admin/events.ts b/src/controllers/admin/events.ts index 3d59892090..226f818736 100644 --- a/src/controllers/admin/events.ts +++ b/src/controllers/admin/events.ts @@ -1,10 +1,10 @@ 'use strict'; -const db = require('../../database'); -const events = require('../../events'); -const pagination = require('../../pagination'); +import db from '../../database'; +import events from '../../events'; +import pagination from '../../pagination'; -const eventsController = module.exports; +const eventsController = {} as any; eventsController.get = async function (req, res) { const page = parseInt(req.query.page, 10) || 1; @@ -13,8 +13,8 @@ eventsController.get = async function (req, res) { const stop = start + itemsPerPage - 1; // Limit by date - let from = req.query.start ? new Date(req.query.start) || undefined : undefined; - let to = req.query.end ? new Date(req.query.end) || undefined : new Date(); + let from: any = req.query.start ? new Date(req.query.start) || undefined : undefined; + let to: any = req.query.end ? new Date(req.query.end) || undefined : new Date(); from = from && from.setHours(0, 0, 0, 0); // setHours returns a unix timestamp (Number, not Date) to = to && to.setHours(23, 59, 59, 999); // setHours returns a unix timestamp (Number, not Date) @@ -42,3 +42,5 @@ eventsController.get = async function (req, res) { query: req.query, }); }; + +export default eventsController; \ No newline at end of file diff --git a/src/controllers/admin/groups.ts b/src/controllers/admin/groups.ts index 1a7dc950c7..8eb9f0ec21 100644 --- a/src/controllers/admin/groups.ts +++ b/src/controllers/admin/groups.ts @@ -1,17 +1,16 @@ 'use strict'; -const nconf = require('nconf'); -const validator = require('validator'); +import nconf from 'nconf'; +import validator from 'validator'; +import db from '../../database'; +import user from '../../user'; +import groups from '../../groups'; +import meta from '../../meta'; +import pagination from '../../pagination'; +import events from '../../events'; +import slugify from '../../slugify'; -const db = require('../../database'); -const user = require('../../user'); -const groups = require('../../groups'); -const meta = require('../../meta'); -const pagination = require('../../pagination'); -const events = require('../../events'); -const slugify = require('../../slugify'); - -const groupsController = module.exports; +const groupsController = {} as any; groupsController.list = async function (req, res) { const page = parseInt(req.query.page, 10) || 1; @@ -96,3 +95,5 @@ groupsController.getCSV = async function (req, res) { res.setHeader('Content-Type', 'text/csv'); res.end(csvContent); }; + +export default groupsController; \ No newline at end of file diff --git a/src/controllers/admin/hooks.ts b/src/controllers/admin/hooks.ts index c3511ebaf3..888a0bb527 100644 --- a/src/controllers/admin/hooks.ts +++ b/src/controllers/admin/hooks.ts @@ -1,9 +1,9 @@ 'use strict'; -const validator = require('validator'); -const plugins = require('../../plugins'); +import validator from 'validator'; +import plugins from '../../plugins'; -const hooksController = module.exports; +const hooksController = {} as any; hooksController.get = function (req, res) { const hooks = []; @@ -30,3 +30,5 @@ hooksController.get = function (req, res) { res.render('admin/advanced/hooks', { hooks: hooks }); }; + +export default hooksController; \ No newline at end of file diff --git a/src/controllers/admin/info.ts b/src/controllers/admin/info.ts index 45ffe078b7..b0c19994ba 100644 --- a/src/controllers/admin/info.ts +++ b/src/controllers/admin/info.ts @@ -1,17 +1,17 @@ 'use strict'; -const os = require('os'); -const winston = require('winston'); -const nconf = require('nconf'); -const { exec } = require('child_process'); +import os from 'os'; +import winston from 'winston'; +import nconf from 'nconf'; +import { exec } from 'child_process'; +import pubsub from '../../pubsub'; +import rooms from '../../socket.io/admin/rooms'; +import { promisify } from 'util'; -const pubsub = require('../../pubsub'); -const rooms = require('../../socket.io/admin/rooms'); - -const infoController = module.exports; +const infoController = {} as any; let info = {}; -let previousUsage = process.cpuUsage(); +let previousUsage = (process as any).cpuUsage(); let usageStartDate = Date.now(); infoController.get = function (req, res) { @@ -53,7 +53,7 @@ pubsub.on('sync:node:info:start', async () => { const data = await getNodeInfo(); data.id = `${os.hostname()}:${nconf.get('port')}`; pubsub.publish('sync:node:info:end', { data: data, id: data.id }); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }); @@ -66,11 +66,11 @@ async function getNodeInfo() { const data = { process: { port: nconf.get('port'), - pid: process.pid, - title: process.title, - version: process.version, - memoryUsage: process.memoryUsage(), - uptime: process.uptime(), + pid: (process as any).pid, + title: (process as any).title, + version: (process as any).version, + memoryUsage: (process as any).memoryUsage(), + uptime: (process as any).uptime(), cpuUsage: getCpuUsage(), }, os: { @@ -89,7 +89,7 @@ async function getNodeInfo() { runJobs: nconf.get('runJobs'), jobsDisabled: nconf.get('jobsDisabled'), }, - }; + } as any; data.process.memoryUsage.humanReadable = (data.process.memoryUsage.rss / (1024 * 1024 * 1024)).toFixed(3); data.process.uptimeHumanReadable = humanReadableUptime(data.process.uptime); @@ -106,7 +106,7 @@ async function getNodeInfo() { } function getCpuUsage() { - const newUsage = process.cpuUsage(); + const newUsage = (process as any).cpuUsage(); const diff = (newUsage.user + newUsage.system) - (previousUsage.user + previousUsage.system); const now = Date.now(); const result = diff / ((now - usageStartDate) * 1000) * 100; @@ -135,10 +135,12 @@ async function getGitInfo() { callback(null, stdout ? stdout.replace(/\n$/, '') : 'no-git-info'); }); } - const getAsync = require('util').promisify(get); + const getAsync = promisify(get); const [hash, branch] = await Promise.all([ getAsync('git rev-parse HEAD'), getAsync('git rev-parse --abbrev-ref HEAD'), - ]); + ]) as [any, any]; return { hash: hash, hashShort: hash.slice(0, 6), branch: branch }; } + +export default infoController; \ No newline at end of file diff --git a/src/controllers/admin/logger.ts b/src/controllers/admin/logger.ts index ad4c83e738..57e1e19f33 100644 --- a/src/controllers/admin/logger.ts +++ b/src/controllers/admin/logger.ts @@ -1,7 +1,9 @@ 'use strict'; -const loggerController = module.exports; +const loggerController = {} as any; loggerController.get = function (req, res) { res.render('admin/development/logger', {}); }; + +export default loggerController; \ No newline at end of file diff --git a/src/controllers/admin/logs.ts b/src/controllers/admin/logs.ts index 51ed116eca..b396326852 100644 --- a/src/controllers/admin/logs.ts +++ b/src/controllers/admin/logs.ts @@ -1,20 +1,21 @@ 'use strict'; -const validator = require('validator'); -const winston = require('winston'); +import validator from 'validator'; +import winston from 'winston'; +import meta from '../../meta'; -const meta = require('../../meta'); - -const logsController = module.exports; +const logsController = {} as any; logsController.get = async function (req, res) { let logs = ''; try { logs = await meta.logs.get(); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } res.render('admin/advanced/logs', { data: validator.escape(logs), }); }; + +export default logsController; \ No newline at end of file diff --git a/src/controllers/admin/plugins.ts b/src/controllers/admin/plugins.ts index a0b7457f01..c6dee4956b 100644 --- a/src/controllers/admin/plugins.ts +++ b/src/controllers/admin/plugins.ts @@ -1,11 +1,11 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); -const plugins = require('../../plugins'); -const meta = require('../../meta'); +import nconf from 'nconf'; +import winston from 'winston'; +import plugins from '../../plugins'; +import meta from '../../meta'; -const pluginsController = module.exports; +const pluginsController = {} as any; pluginsController.get = async function (req, res) { const [compatible, all, trending] = await Promise.all([ @@ -62,8 +62,10 @@ async function getPlugins(matching) { try { const pluginsData = await plugins.list(matching); return pluginsData || []; - } catch (err) { + } catch (err: any) { winston.error(err.stack); return []; } } + +export default pluginsController; \ No newline at end of file diff --git a/src/controllers/admin/privileges.ts b/src/controllers/admin/privileges.ts index 28833b5562..a875f8fb43 100644 --- a/src/controllers/admin/privileges.ts +++ b/src/controllers/admin/privileges.ts @@ -1,9 +1,9 @@ 'use strict'; -const categories = require('../../categories'); -const privileges = require('../../privileges'); +import categories from '../../categories'; +import privileges from '../../privileges'; -const privilegesController = module.exports; +const privilegesController = {} as any; privilegesController.get = async function (req, res) { const cid = req.params.cid ? parseInt(req.params.cid, 10) || 0 : 0; @@ -27,7 +27,7 @@ privilegesController.get = async function (req, res) { }]; let selectedCategory; - categoriesData.forEach((category) => { + categoriesData.forEach((category: any) => { if (category) { category.selected = category.cid === (!isAdminPriv ? cid : 'admin'); @@ -50,3 +50,5 @@ privilegesController.get = async function (req, res) { isAdminPriv, }); }; + +export default privilegesController; \ No newline at end of file diff --git a/src/controllers/admin/rewards.ts b/src/controllers/admin/rewards.ts index 062bbdcf9a..444223f4e7 100644 --- a/src/controllers/admin/rewards.ts +++ b/src/controllers/admin/rewards.ts @@ -1,10 +1,12 @@ 'use strict'; -const admin = require('../../rewards/admin'); +import admin from '../../rewards/admin'; -const rewardsController = module.exports; +const rewardsController = {} as any; rewardsController.get = async function (req, res) { const data = await admin.get(); res.render('admin/extend/rewards', data); }; + +export default rewardsController; diff --git a/src/controllers/admin/settings.ts b/src/controllers/admin/settings.ts index ca0765cc02..19237de79f 100644 --- a/src/controllers/admin/settings.ts +++ b/src/controllers/admin/settings.ts @@ -1,19 +1,17 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import meta from '../../meta'; +import emailer from '../../emailer'; +import notifications from '../../notifications'; +import groups from '../../groups'; +import languages from '../../languages'; +import navigationAdmin from '../../navigation/admin'; +import social from '../../social'; +import helpers from '../helpers'; +import translator from '../../translator'; -const meta = require('../../meta'); -const emailer = require('../../emailer'); -const notifications = require('../../notifications'); -const groups = require('../../groups'); -const languages = require('../../languages'); -const navigationAdmin = require('../../navigation/admin'); -const social = require('../../social'); - -const helpers = require('../helpers'); -const translator = require('../../translator'); - -const settingsController = module.exports; +const settingsController = {} as any; settingsController.get = async function (req, res) { const term = req.params.term || 'general'; @@ -108,3 +106,5 @@ settingsController.social = async function (req, res) { posts: posts, }); }; + +export default settingsController; diff --git a/src/controllers/admin/tags.ts b/src/controllers/admin/tags.ts index eff1ae714c..419733d24c 100644 --- a/src/controllers/admin/tags.ts +++ b/src/controllers/admin/tags.ts @@ -1,10 +1,12 @@ 'use strict'; -const topics = require('../../topics'); +import topics from '../../topics'; -const tagsController = module.exports; +const tagsController = {} as any; tagsController.get = async function (req, res) { const tags = await topics.getTags(0, 199); res.render('admin/manage/tags', { tags: tags }); }; + +export default tagsController; diff --git a/src/controllers/admin/themes.ts b/src/controllers/admin/themes.ts index db08d08f84..ac4da72beb 100644 --- a/src/controllers/admin/themes.ts +++ b/src/controllers/admin/themes.ts @@ -1,12 +1,11 @@ 'use strict'; -const path = require('path'); -const fs = require('fs'); +import path from 'path'; +import fs from 'fs'; +import file from '../../file'; +import { paths } from '../../constants'; -const file = require('../../file'); -const { paths } = require('../../constants'); - -const themesController = module.exports; +const themesController = {} as any; const defaultScreenshotPath = path.join(__dirname, '../../../public/images/themes/default.png'); @@ -18,7 +17,7 @@ themesController.get = async function (req, res, next) { try { themeConfig = await fs.promises.readFile(themeConfigPath, 'utf8'); themeConfig = JSON.parse(themeConfig); - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return next(Error('invalid-data')); } @@ -29,3 +28,5 @@ themesController.get = async function (req, res, next) { const exists = await file.exists(screenshotPath); res.sendFile(exists ? screenshotPath : defaultScreenshotPath); }; + +export default themesController; \ No newline at end of file diff --git a/src/controllers/admin/uploads.ts b/src/controllers/admin/uploads.ts index 6c20300e17..87cce095d4 100644 --- a/src/controllers/admin/uploads.ts +++ b/src/controllers/admin/uploads.ts @@ -1,19 +1,18 @@ 'use strict'; -const path = require('path'); -const nconf = require('nconf'); -const fs = require('fs'); - -const meta = require('../../meta'); -const posts = require('../../posts'); -const file = require('../../file'); -const image = require('../../image'); -const plugins = require('../../plugins'); -const pagination = require('../../pagination'); +import path from 'path'; +import nconf from 'nconf'; +import fs from 'fs'; +import meta from '../../meta'; +import posts from '../../posts'; +import file from '../../file'; +import image from '../../image'; +import plugins from '../../plugins'; +import pagination from '../../pagination'; const allowedImageTypes = ['image/png', 'image/jpeg', 'image/pjpeg', 'image/jpg', 'image/gif', 'image/svg+xml']; -const uploadsController = module.exports; +const uploadsController = {} as any; uploadsController.get = async function (req, res, next) { const currentFolder = path.join(nconf.get('upload_path'), req.query.dir || ''); @@ -33,7 +32,7 @@ uploadsController.get = async function (req, res, next) { files = await filesToData(currentFolder, files); // Float directories to the top - files.sort((a, b) => { + files.sort((a: any, b: any) => { if (a.isDirectory && !b.isDirectory) { return -1; } else if (!a.isDirectory && b.isDirectory) { @@ -48,7 +47,7 @@ uploadsController.get = async function (req, res, next) { // Add post usage info if in /files if (['files', '/files', '/files/'].includes(req.query.dir)) { const usage = await posts.uploads.getUsage(files); - files.forEach((file, idx) => { + files.forEach((file: any, idx) => { file.inPids = usage[idx].map(pid => parseInt(pid, 10)); }); } @@ -59,7 +58,7 @@ uploadsController.get = async function (req, res, next) { breadcrumbs: buildBreadcrumbs(currentFolder), pagination: pagination.create(page, Math.ceil(itemCount / itemsPerPage), req.query), }); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -113,8 +112,7 @@ uploadsController.uploadCategoryPicture = async function (req, res, next) { try { params = JSON.parse(req.body.params); - } catch (e) { - file.delete(uploadedFile.path); +} catch (e: any) { file.delete(uploadedFile.path); return next(new Error('[[error:invalid-json]]')); } @@ -132,7 +130,7 @@ uploadsController.uploadFavicon = async function (req, res, next) { try { const imageObj = await file.saveFileToLocal('favicon.ico', 'system', uploadedFile.path); res.json([{ name: uploadedFile.name, url: imageObj.url }]); - } catch (err) { + } catch (err: any) { next(err); } finally { file.delete(uploadedFile.path); @@ -159,7 +157,7 @@ uploadsController.uploadTouchIcon = async function (req, res, next) { }); } res.json([{ name: uploadedFile.name, url: imageObj.url }]); - } catch (err) { + } catch (err: any) { next(err); } finally { file.delete(uploadedFile.path); @@ -176,7 +174,7 @@ uploadsController.uploadMaskableIcon = async function (req, res, next) { try { const imageObj = await file.saveFileToLocal('maskableicon-orig.png', 'system', uploadedFile.path); res.json([{ name: uploadedFile.name, url: imageObj.url }]); - } catch (err) { + } catch (err: any) { next(err); } finally { file.delete(uploadedFile.path); @@ -193,15 +191,14 @@ uploadsController.uploadFile = async function (req, res, next) { let params; try { params = JSON.parse(req.body.params); - } catch (e) { - file.delete(uploadedFile.path); +} catch (e: any) { file.delete(uploadedFile.path); return next(new Error('[[error:invalid-json]]')); } try { const data = await file.saveFileToLocal(uploadedFile.name, params.folder, uploadedFile.path); res.json([{ url: data.url }]); - } catch (err) { + } catch (err: any) { next(err); } finally { file.delete(uploadedFile.path); @@ -265,9 +262,11 @@ async function uploadImage(filename, folder, uploadedFile, req, res, next) { }); } res.json([{ name: uploadedFile.name, url: imageData.url.startsWith('http') ? imageData.url : nconf.get('relative_path') + imageData.url }]); - } catch (err) { + } catch (err: any) { next(err); } finally { file.delete(uploadedFile.path); } } + +export default uploadsController; \ No newline at end of file diff --git a/src/controllers/admin/users.ts b/src/controllers/admin/users.ts index d6166bc165..205d489694 100644 --- a/src/controllers/admin/users.ts +++ b/src/controllers/admin/users.ts @@ -1,17 +1,19 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import user from '../../user'; +import meta from '../../meta'; +import db from '../../database'; +import pagination from '../../pagination'; +import events from '../../events'; +import plugins from '../../plugins'; +import privileges from '../../privileges'; +import utils from '../../utils'; +import path from 'path'; +import * as constants from '../../constants'; +const { paths: { baseDir } } = constants; -const user = require('../../user'); -const meta = require('../../meta'); -const db = require('../../database'); -const pagination = require('../../pagination'); -const events = require('../../events'); -const plugins = require('../../plugins'); -const privileges = require('../../privileges'); -const utils = require('../../utils'); - -const usersController = module.exports; +const usersController = {} as any; const userFields = [ 'uid', 'username', 'userslug', 'email', 'postcount', 'joindate', 'banned', @@ -260,8 +262,6 @@ usersController.getCSV = async function (req, res, next) { uid: req.uid, ip: req.ip, }); - const path = require('path'); - const { baseDir } = require('../../constants').paths; res.sendFile('users.csv', { root: path.join(baseDir, 'build/export'), headers: { @@ -278,3 +278,5 @@ usersController.getCSV = async function (req, res, next) { } }); }; + +export default usersController; \ No newline at end of file diff --git a/src/controllers/admin/widgets.ts b/src/controllers/admin/widgets.ts index 04ac72fd23..3130681029 100644 --- a/src/controllers/admin/widgets.ts +++ b/src/controllers/admin/widgets.ts @@ -1,9 +1,11 @@ 'use strict'; -const widgetsController = module.exports; -const admin = require('../../widgets/admin'); +const widgetsController = {} as any; +import admin from '../../widgets/admin'; widgetsController.get = async function (req, res) { const data = await admin.get(); res.render('admin/extend/widgets', data); }; + +export default widgetsController; \ No newline at end of file diff --git a/src/controllers/api.ts b/src/controllers/api.ts index 7474f6e7a0..743dad1566 100644 --- a/src/controllers/api.ts +++ b/src/controllers/api.ts @@ -1,16 +1,15 @@ 'use strict'; -const validator = require('validator'); -const nconf = require('nconf'); +import validator from 'validator'; +import nconf from 'nconf'; +import meta from '../meta'; +import user from '../user'; +import categories from '../categories'; +import plugins from '../plugins'; +import translator from '../translator'; +import languages from '../languages'; -const meta = require('../meta'); -const user = require('../user'); -const categories = require('../categories'); -const plugins = require('../plugins'); -const translator = require('../translator'); -const languages = require('../languages'); - -const apiController = module.exports; +const apiController = {} as any; const relative_path = nconf.get('relative_path'); const upload_url = nconf.get('upload_url'); @@ -84,7 +83,7 @@ apiController.loadConfig = async function (req) { iconBackgrounds: await user.getIconBackgrounds(req.uid), emailPrompt: meta.config.emailPrompt, useragent: req.useragent, - }; + } as any; let settings = config; let isAdminOrGlobalMod; @@ -128,4 +127,7 @@ apiController.getModerators = async function (req, res) { res.json({ moderators: moderators }); }; -require('../promisify')(apiController, ['getConfig', 'getObject', 'getModerators']); +import promisify from '../promisify'; +promisify(apiController, ['getConfig', 'getObject', 'getModerators']); + +export default apiController; \ No newline at end of file diff --git a/src/controllers/authentication.ts b/src/controllers/authentication.ts index 885088dd26..ea7d48fe3a 100644 --- a/src/controllers/authentication.ts +++ b/src/controllers/authentication.ts @@ -1,24 +1,23 @@ 'use strict'; -const winston = require('winston'); -const passport = require('passport'); -const nconf = require('nconf'); -const validator = require('validator'); -const _ = require('lodash'); -const util = require('util'); +import winston from 'winston'; +import passport from 'passport'; +import nconf from 'nconf'; +import validator from 'validator'; +import _ from 'lodash'; +import util from 'util'; +import db from '../database'; +import meta from '../meta'; +import analytics from '../analytics'; +import user from '../user'; +import plugins from '../plugins'; +import utils from '../utils'; +import slugify from '../slugify'; +import helpers from './helpers'; +import privileges from '../privileges'; +import sockets from '../socket.io'; -const db = require('../database'); -const meta = require('../meta'); -const analytics = require('../analytics'); -const user = require('../user'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const helpers = require('./helpers'); -const privileges = require('../privileges'); -const sockets = require('../socket.io'); - -const authenticationController = module.exports; +const authenticationController = {} as any; async function registerAndLoginUser(req, res, userData) { if (!userData.hasOwnProperty('email')) { @@ -112,7 +111,7 @@ authenticationController.register = async function (req, res) { } res.json(data); } - } catch (err) { + } catch (err: any) { helpers.noScriptErrors(req, res, err.message, 400); } }; @@ -153,7 +152,7 @@ authenticationController.registerComplete = async function (req, res) { return memo; }, []); - const done = function (data) { + const done = function (data?) { delete req.session.registration; const relative_path = nconf.get('relative_path'); if (data && data.message) { @@ -203,7 +202,7 @@ authenticationController.registerComplete = async function (req, res) { await user.setUserFields(uid, payload); done(); } - } catch (err) { + } catch (err: any) { delete req.session.registration; res.redirect(`${nconf.get('relative_path')}/?register=${encodeURIComponent(err.message)}`); } @@ -243,7 +242,7 @@ authenticationController.login = async (req, res, next) => { const errorHandler = res.locals.noScriptErrors || helpers.noScriptErrors; try { await plugins.hooks.fire('filter:login.check', { req: req, res: res, userData: req.body }); - } catch (err) { + } catch (err: any) { return errorHandler(req, res, err.message, 403); } try { @@ -260,13 +259,13 @@ authenticationController.login = async (req, res, next) => { } else { errorHandler(req, res, `[[error:wrong-login-type-${loginWith}]]`, 400); } - } catch (err) { + } catch (err: any) { return errorHandler(req, res, err.message, 500); } }; function continueLogin(strategy, req, res, next) { - passport.authenticate(strategy, async (err, userData, info) => { + (passport as any).authenticate(strategy, async (err, userData, info) => { if (err) { plugins.hooks.fire('action:login.continue', { req, strategy, userData, error: err }); return helpers.noScriptErrors(req, res, err.data || err.message, 403); @@ -390,7 +389,7 @@ authenticationController.onSuccessfulLogin = async function (req, uid) { sockets.in(`sess_${req.sessionID}`).emit('checkSession', uid); plugins.hooks.fire('action:user.loggedIn', { uid: uid, req: req }); - } catch (err) { + } catch (err: any) { req.session.destroy(); throw err; } @@ -436,7 +435,7 @@ authenticationController.localLogin = async function (req, username, password, n } next(null, userData, '[[success:authentication-successful]]'); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -474,7 +473,7 @@ authenticationController.logout = async function (req, res, next) { return res.redirect(payload.next); } res.status(200).send(payload); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -486,10 +485,10 @@ async function getBanError(uid) { if (!banInfo.reason) { banInfo.reason = '[[user:info.banned-no-reason]]'; } - const err = new Error(banInfo.reason); + const err: any = new Error(banInfo.reason); err.data = banInfo; return err; - } catch (err) { + } catch (err: any) { if (err.message === 'no-ban-info') { return new Error('[[error:user-banned]]'); } @@ -497,4 +496,7 @@ async function getBanError(uid) { } } -require('../promisify')(authenticationController, ['register', 'registerComplete', 'registerAbort', 'login', 'localLogin', 'logout']); +import promisify from '../promisify'; +promisify(authenticationController, ['register', 'registerComplete', 'registerAbort', 'login', 'localLogin', 'logout']); + +export default authenticationController; \ No newline at end of file diff --git a/src/controllers/categories.ts b/src/controllers/categories.ts index 435ea41334..92147eef7c 100644 --- a/src/controllers/categories.ts +++ b/src/controllers/categories.ts @@ -1,15 +1,14 @@ 'use strict'; -const nconf = require('nconf'); -const _ = require('lodash'); +import nconf from 'nconf'; +import _ from 'lodash'; +import categories from '../categories'; +import meta from '../meta'; +import pagination from '../pagination'; +import helpers from './helpers'; +import privileges from '../privileges'; -const categories = require('../categories'); -const meta = require('../meta'); -const pagination = require('../pagination'); -const helpers = require('./helpers'); -const privileges = require('../privileges'); - -const categoriesController = module.exports; +const categoriesController = {} as any; categoriesController.list = async function (req, res) { res.locals.metaTags = [{ @@ -39,7 +38,7 @@ categoriesController.list = async function (req, res) { selectCategoryLabel: '[[pages:categories]]', categories: tree, pagination: pagination.create(page, pageCount, req.query), - }; + } as any; data.categories.forEach((category) => { if (category) { @@ -59,3 +58,5 @@ categoriesController.list = async function (req, res) { res.render('categories', data); }; + +export default categoriesController; \ No newline at end of file diff --git a/src/controllers/category.ts b/src/controllers/category.ts index d233dbb369..41f028e0ca 100644 --- a/src/controllers/category.ts +++ b/src/controllers/category.ts @@ -1,22 +1,20 @@ 'use strict'; +import nconf from 'nconf'; +import validator from 'validator'; +import qs from 'querystring'; +import db from '../database'; +import privileges from '../privileges'; +import user from '../user'; +import categories from '../categories'; +import meta from '../meta'; +import pagination from '../pagination'; +import helpers from './helpers'; +import utils from '../utils'; +import translator from '../translator'; +import analytics from '../analytics'; -const nconf = require('nconf'); -const validator = require('validator'); -const qs = require('querystring'); - -const db = require('../database'); -const privileges = require('../privileges'); -const user = require('../user'); -const categories = require('../categories'); -const meta = require('../meta'); -const pagination = require('../pagination'); -const helpers = require('./helpers'); -const utils = require('../utils'); -const translator = require('../translator'); -const analytics = require('../analytics'); - -const categoryController = module.exports; +const categoryController = {} as any; const url = nconf.get('url'); const relative_path = nconf.get('relative_path'); @@ -62,7 +60,7 @@ categoryController.get = async function (req, res, next) { if (!userSettings.usePagination) { topicIndex = Math.max(0, topicIndex - (Math.ceil(userSettings.topicsPerPage / 2) - 1)); } else if (!req.query.page) { - const index = Math.max(parseInt((topicIndex || 0), 10), 0); + const index = Math.max(parseInt(String(topicIndex || 0), 10), 0); currentPage = Math.ceil((index + 1) / userSettings.topicsPerPage); topicIndex = 0; } @@ -204,3 +202,5 @@ function addTags(categoryData, res) { }); } } + +export default categoryController; \ No newline at end of file diff --git a/src/controllers/composer.ts b/src/controllers/composer.ts index d82214fb91..4a75fa3227 100644 --- a/src/controllers/composer.ts +++ b/src/controllers/composer.ts @@ -1,14 +1,13 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import user from '../user'; +import plugins from '../plugins'; +import topics from '../topics'; +import posts from '../posts'; +import helpers from './helpers'; -const user = require('../user'); -const plugins = require('../plugins'); -const topics = require('../topics'); -const posts = require('../posts'); -const helpers = require('./helpers'); - -exports.get = async function (req, res, callback) { +export const get = async function (req, res, callback) { res.locals.metaTags = { ...res.locals.metaTags, name: 'robots', @@ -39,7 +38,7 @@ exports.get = async function (req, res, callback) { } }; -exports.post = async function (req, res) { +export const post = async function (req, res) { const { body } = req; const data = { uid: req.uid, @@ -47,7 +46,7 @@ exports.post = async function (req, res) { timestamp: Date.now(), content: body.content, fromQueue: false, - }; + } as any; req.body.noscript = 'true'; if (!data.content) { @@ -83,7 +82,7 @@ exports.post = async function (req, res) { user.updateOnlineUsers(uid); const path = result.pid ? `/post/${result.pid}` : `/topic/${result.topicData.slug}`; res.redirect(nconf.get('relative_path') + path); - } catch (err) { + } catch (err: any) { helpers.noScriptErrors(req, res, err.message, 400); } }; diff --git a/src/controllers/errors.ts b/src/controllers/errors.ts index 8071c54371..27952d2cd8 100644 --- a/src/controllers/errors.ts +++ b/src/controllers/errors.ts @@ -1,15 +1,15 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); -const validator = require('validator'); -const translator = require('../translator'); -const plugins = require('../plugins'); -const middleware = require('../middleware'); -const middlewareHelpers = require('../middleware/helpers'); -const helpers = require('./helpers'); +import nconf from 'nconf'; +import winston from 'winston'; +import validator from 'validator'; +import translator from '../translator'; +import plugins from '../plugins'; +import middleware from '../middleware'; +import middlewareHelpers from '../middleware/helpers'; +import helpers from './helpers'; -exports.handleURIErrors = async function handleURIErrors(err, req, res, next) { +export const handleURIErrors = async function handleURIErrors(err, req, res, next) { // Handle cases where malformed URIs are passed in if (err instanceof URIError) { const cleanPath = req.path.replace(new RegExp(`^${nconf.get('relative_path')}`), ''); @@ -38,7 +38,7 @@ exports.handleURIErrors = async function handleURIErrors(err, req, res, next) { // this needs to have four arguments or express treats it as `(req, res, next)` // don't remove `next`! -exports.handleErrors = async function handleErrors(err, req, res, next) { // eslint-disable-line no-unused-vars +export const handleErrors = async function handleErrors(err, req, res, next) { // eslint-disable-line no-unused-vars const cases = { EBADCSRFTOKEN: function () { winston.error(`${req.method} ${req.originalUrl}\n${err.message}`); @@ -90,7 +90,7 @@ exports.handleErrors = async function handleErrors(err, req, res, next) { // esl } else { await defaultHandler(); } - } catch (_err) { + } catch (_err: any) { winston.error(`${req.method} ${req.originalUrl}\n${_err.stack}`); if (!res.headersSent) { res.status(500).send(_err.message); @@ -103,7 +103,7 @@ async function getErrorHandlers(cases) { return await plugins.hooks.fire('filter:error.handle', { cases: cases, }); - } catch (err) { + } catch (err: any) { // Assume defaults winston.warn(`[errors/handle] Unable to retrieve plugin handlers for errors: ${err.message}`); return { cases }; diff --git a/src/controllers/globalmods.ts b/src/controllers/globalmods.ts index 2ad0d54b4f..be11c57d3f 100644 --- a/src/controllers/globalmods.ts +++ b/src/controllers/globalmods.ts @@ -1,12 +1,12 @@ 'use strict'; -const user = require('../user'); -const meta = require('../meta'); -const analytics = require('../analytics'); -const usersController = require('./admin/users'); -const helpers = require('./helpers'); +import user from '../user'; +import meta from '../meta'; +import analytics from '../analytics'; +import usersController from './admin/users'; +import helpers from './helpers'; -const globalModsController = module.exports; +const globalModsController = {} as any; globalModsController.ipBlacklist = async function (req, res, next) { const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(req.uid); @@ -34,3 +34,4 @@ globalModsController.registrationQueue = async function (req, res, next) { } await usersController.registrationQueue(req, res); }; +export default globalModsController; \ No newline at end of file diff --git a/src/controllers/groups.ts b/src/controllers/groups.ts index e7b32899b7..94604e94ea 100644 --- a/src/controllers/groups.ts +++ b/src/controllers/groups.ts @@ -1,16 +1,15 @@ 'use strict'; -const validator = require('validator'); -const nconf = require('nconf'); +import validator from 'validator'; +import nconf from 'nconf'; +import meta from '../meta'; +import groups from '../groups'; +import user from '../user'; +import helpers from './helpers'; +import pagination from '../pagination'; +import privileges from '../privileges'; -const meta = require('../meta'); -const groups = require('../groups'); -const user = require('../user'); -const helpers = require('./helpers'); -const pagination = require('../pagination'); -const privileges = require('../privileges'); - -const groupsController = module.exports; +const groupsController = {} as any; groupsController.list = async function (req, res) { const sort = req.query.sort || 'alpha'; @@ -118,3 +117,5 @@ groupsController.members = async function (req, res, next) { breadcrumbs: breadcrumbs, }); }; + +export default groupsController; \ No newline at end of file diff --git a/src/controllers/helpers.ts b/src/controllers/helpers.ts index cbb15b10ac..880e5ee80a 100644 --- a/src/controllers/helpers.ts +++ b/src/controllers/helpers.ts @@ -1,21 +1,23 @@ 'use strict'; -const nconf = require('nconf'); -const validator = require('validator'); -const querystring = require('querystring'); -const _ = require('lodash'); -const chalk = require('chalk'); +import nconf from 'nconf'; +import validator from 'validator'; +import querystring from 'querystring'; +import _ from 'lodash'; +import chalk from 'chalk'; +import translator from '../translator'; +import user from '../user'; +import privileges from '../privileges'; +import categories from '../categories'; +import plugins from '../plugins'; +import meta from '../meta'; +import middlewareHelpers from '../middleware/helpers'; +import utils from '../utils'; +import middleware from '../middleware'; -const translator = require('../translator'); -const user = require('../user'); -const privileges = require('../privileges'); -const categories = require('../categories'); -const plugins = require('../plugins'); -const meta = require('../meta'); -const middlewareHelpers = require('../middleware/helpers'); -const utils = require('../utils'); -const helpers = module.exports; + +const helpers = {} as any; const relative_path = nconf.get('relative_path'); const url = nconf.get('url'); @@ -27,7 +29,6 @@ helpers.noScriptErrors = async function (req, res, error, httpStatus) { } return res.status(httpStatus).json(error); } - const middleware = require('../middleware'); const httpStatusString = httpStatus.toString(); await middleware.buildHeaderAsync(req, res); res.status(httpStatus).render(httpStatusString, { @@ -143,7 +144,6 @@ helpers.notAllowed = async function (req, res, error) { }); } } else { - const middleware = require('../middleware'); await middleware.buildHeaderAsync(req, res); res.status(403).render('403', { path: req.path, @@ -482,10 +482,10 @@ helpers.formatApiResponse = async (statusCode, res, payload) => { const returnPayload = await helpers.generateError(statusCode, message, res); returnPayload.response = response; - if (global.env === 'development') { + if ((global as any).env === 'development') { returnPayload.stack = payload.stack; - process.stdout.write(`[${chalk.yellow('api')}] Exception caught, error with stack trace follows:\n`); - process.stdout.write(payload.stack); + (process as any).stdout.write(`[${chalk.yellow('api')}] Exception caught, error with stack trace follows:\n`); + (process as any).stdout.write(payload.stack); } res.status(statusCode).json(returnPayload); } else if (!payload) { @@ -496,7 +496,7 @@ helpers.formatApiResponse = async (statusCode, res, payload) => { }; async function generateBannedResponse(res) { - const response = {}; + const response = {} as any; const [reason, expiry] = await Promise.all([ user.bans.getReason(res.req.uid), user.getUserField(res.req.uid, 'banned:expire'), @@ -574,4 +574,6 @@ helpers.generateError = async (statusCode, message, res) => { return payload; }; -require('../promisify')(helpers); +import promisify from '../promisify'; +promisify(helpers); +export default helpers; diff --git a/src/controllers/home.ts b/src/controllers/home.ts index ea596f972f..ddae72c9a8 100644 --- a/src/controllers/home.ts +++ b/src/controllers/home.ts @@ -1,10 +1,9 @@ 'use strict'; -const url = require('url'); - -const plugins = require('../plugins'); -const meta = require('../meta'); -const user = require('../user'); +import url from 'url'; +import plugins from '../plugins'; +import meta from '../meta'; +import user from '../user'; function adminHomePageRoute() { return ((meta.config.homePageRoute === 'custom' ? meta.config.homePageCustom : meta.config.homePageRoute) || 'categories').replace(/^\//, ''); @@ -21,19 +20,19 @@ async function getUserHomeRoute(uid) { return route; } -async function rewrite(req, res, next) { +async function rewriteFn(req, res, next) { if (req.path !== '/' && req.path !== '/api/' && req.path !== '/api') { return next(); } let route = adminHomePageRoute(); if (meta.config.allowUserHomePage) { - route = await getUserHomeRoute(req.uid, next); + route = await getUserHomeRoute(req.uid); } let parsedUrl; try { parsedUrl = url.parse(route, true); - } catch (err) { + } catch (err: any) { return next(err); } @@ -49,7 +48,7 @@ async function rewrite(req, res, next) { next(); } -exports.rewrite = rewrite; +export const rewrite = rewriteFn; function pluginHook(req, res, next) { const hook = `action:homepage.get:${res.locals.homePageRoute}`; @@ -61,4 +60,4 @@ function pluginHook(req, res, next) { }); } -exports.pluginHook = pluginHook; +export default { pluginHook }; diff --git a/src/controllers/index.ts b/src/controllers/index.ts index 1523c7073d..5f8c6b7747 100644 --- a/src/controllers/index.ts +++ b/src/controllers/index.ts @@ -1,44 +1,73 @@ 'use strict'; -const nconf = require('nconf'); -const validator = require('validator'); +import nconf from 'nconf'; +import validator from 'validator'; +import meta from '../meta'; +import user from '../user'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import helpers from './helpers'; +import * as ping from './ping'; +import home from './home'; +import topics from './topics'; +import posts from './posts'; +import categories from './categories'; +import category from './category'; +import unread from './unread'; +import recent from './recent'; +import popular from './popular'; +import top from './top'; +import tags from './tags'; +import search from './search'; +import users from './users'; +import groups from './groups'; +import accounts from './accounts'; +import authentication from './authentication'; +import api from './api'; +import admin from './admin'; +import globalMods from './globalmods'; +import mods from './mods'; +import sitemap from './sitemap'; +import * as osd from './osd'; +import * as errors from './errors'; +import * as composer from './composer'; +import write from './write'; +import getLoginStrategies from '../routes/authentication'; +import { parse as parseUrl } from 'url'; +import authenticationRoute from '../routes/authentication'; +const loginStrategies = authenticationRoute.getLoginStrategies(); -const meta = require('../meta'); -const user = require('../user'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const helpers = require('./helpers'); -const Controllers = module.exports; +const Controllers = {} as any; -Controllers.ping = require('./ping'); -Controllers.home = require('./home'); -Controllers.topics = require('./topics'); -Controllers.posts = require('./posts'); -Controllers.categories = require('./categories'); -Controllers.category = require('./category'); -Controllers.unread = require('./unread'); -Controllers.recent = require('./recent'); -Controllers.popular = require('./popular'); -Controllers.top = require('./top'); -Controllers.tags = require('./tags'); -Controllers.search = require('./search'); -Controllers.user = require('./user'); -Controllers.users = require('./users'); -Controllers.groups = require('./groups'); -Controllers.accounts = require('./accounts'); -Controllers.authentication = require('./authentication'); -Controllers.api = require('./api'); -Controllers.admin = require('./admin'); -Controllers.globalMods = require('./globalmods'); -Controllers.mods = require('./mods'); -Controllers.sitemap = require('./sitemap'); -Controllers.osd = require('./osd'); -Controllers['404'] = require('./404'); -Controllers.errors = require('./errors'); -Controllers.composer = require('./composer'); - -Controllers.write = require('./write'); +Controllers.write = write; +Controllers.ping = ping; +Controllers.home = home; +Controllers.topics = topics; +Controllers.posts = posts; +Controllers.categories = categories; +Controllers.category = category; +Controllers.unread = unread; +Controllers.recent = recent; +Controllers.popular = popular; +Controllers.top = top; +Controllers.tags = tags; +Controllers.search = search; +Controllers.user = user; +Controllers.users = users; +Controllers.groups = groups; +Controllers.accounts = accounts; +Controllers.authentication = authentication; +Controllers.api = api; +Controllers.admin = admin; +Controllers.globalMods = globalMods; +Controllers.mods = mods; +Controllers.sitemap = sitemap; +Controllers.osd = osd; +Controllers['404'] = 404; +Controllers.errors = errors; +Controllers.composer = composer; +Controllers.write = write; Controllers.reset = async function (req, res) { if (meta.config['password:disableEdit']) { @@ -93,8 +122,7 @@ Controllers.reset = async function (req, res) { }; Controllers.login = async function (req, res) { - const data = { loginFormEntry: [] }; - const loginStrategies = require('../routes/authentication').getLoginStrategies(); + const data = { loginFormEntry: [] } as any; const registrationType = meta.config.registrationType || 'normal'; const allowLoginWith = (meta.config.allowLoginWith || 'username-email'); @@ -155,8 +183,7 @@ Controllers.register = async function (req, res, next) { if (registrationType === 'invite-only' || registrationType === 'admin-invite-only') { try { await user.verifyInvitation(req.query); - } catch (e) { - return res.render('400', { + } catch (e: any) { return res.render('400', { error: e.message, }); } @@ -166,7 +193,6 @@ Controllers.register = async function (req, res, next) { req.session.returnTo = returnTo; } - const loginStrategies = require('../routes/authentication').getLoginStrategies(); res.render('register', { 'register_window:spansize': loginStrategies.length ? 'col-md-6' : 'col-md-12', alternate_logins: !!loginStrategies.length, @@ -183,7 +209,7 @@ Controllers.register = async function (req, res, next) { error: req.flash('error')[0] || errorText, title: '[[pages:register]]', }); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -214,7 +240,7 @@ Controllers.registerInterstitial = async function (req, res, next) { sections, errors, }); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -222,8 +248,7 @@ Controllers.registerInterstitial = async function (req, res, next) { Controllers.confirmEmail = async (req, res, next) => { try { await user.email.confirmByCode(req.params.code, req.session.id); - } catch (e) { - if (e.message === '[[error:invalid-data]]') { +} catch (e: any) { if (e.message === '[[error:invalid-data]]') { return next(); } @@ -259,7 +284,7 @@ Controllers.manifest = async function (req, res) { theme_color: meta.config.themeColor || '#ffffff', background_color: meta.config.backgroundColor || '#ffffff', icons: [], - }; + } as any; if (meta.config['brand:touchIcon']) { manifest.icons.push({ @@ -329,7 +354,7 @@ Controllers.outgoing = function (req, res, next) { 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', ]; - const parsed = require('url').parse(url); + const parsed = parseUrl(url); if (!url || !parsed.protocol || !allowedProtocols.includes(parsed.protocol.slice(0, -1))) { return next(); @@ -357,3 +382,5 @@ Controllers.termsOfUse = async function (req, res, next) { termsOfUse: termsOfUse.postData.content, }); }; + +export default Controllers; \ No newline at end of file diff --git a/src/controllers/mods.ts b/src/controllers/mods.ts index 48a3bd8ff3..0f411577e5 100644 --- a/src/controllers/mods.ts +++ b/src/controllers/mods.ts @@ -1,16 +1,16 @@ 'use strict'; -const user = require('../user'); -const posts = require('../posts'); -const flags = require('../flags'); -const analytics = require('../analytics'); -const plugins = require('../plugins'); -const pagination = require('../pagination'); -const privileges = require('../privileges'); -const utils = require('../utils'); -const helpers = require('./helpers'); +import user from '../user'; +import posts from '../posts'; +import flags from '../flags'; +import analytics from '../analytics'; +import plugins from '../plugins'; +import pagination from '../pagination'; +import privileges from '../privileges'; +import utils from '../utils'; +import helpers from './helpers'; -const modsController = module.exports; +const modsController = {} as any; modsController.flags = {}; modsController.flags.list = async function (req, res) { @@ -181,7 +181,7 @@ modsController.postQueue = async function (req, res, next) { const start = (page - 1) * postsPerPage; const stop = start + postsPerPage - 1; postData = postData.slice(start, stop + 1); - const crumbs = [{ text: '[[pages:post-queue]]', url: id ? '/post-queue' : undefined }]; + const crumbs = [{ text: '[[pages:post-queue]]', url: id ? '/post-queue' : undefined }] as any[]; if (id && postData.length) { const text = postData[0].data.tid ? '[[post-queue:reply]]' : '[[post-queue:topic]]'; crumbs.push({ text: text }); @@ -198,3 +198,5 @@ modsController.postQueue = async function (req, res, next) { singlePost: !!id, }); }; + +export default modsController; \ No newline at end of file diff --git a/src/controllers/osd.ts b/src/controllers/osd.ts index 244f8326f4..7054c01a87 100644 --- a/src/controllers/osd.ts +++ b/src/controllers/osd.ts @@ -1,12 +1,11 @@ 'use strict'; -const xml = require('xml'); -const nconf = require('nconf'); +import xml from 'xml'; +import nconf from 'nconf'; +import plugins from '../plugins'; +import meta from '../meta'; -const plugins = require('../plugins'); -const meta = require('../meta'); - -module.exports.handle = function (req, res, next) { +export const handle = function (req, res, next) { if (plugins.hooks.hasListeners('filter:search.query')) { res.type('application/opensearchdescription+xml').send(generateXML()); } else { diff --git a/src/controllers/ping.ts b/src/controllers/ping.ts index dc4baed1f8..be1d277788 100644 --- a/src/controllers/ping.ts +++ b/src/controllers/ping.ts @@ -1,13 +1,13 @@ 'use strict'; -const nconf = require('nconf'); -const db = require('../database'); +import nconf from 'nconf'; +import db from '../database'; -module.exports.ping = async function (req, res, next) { +export const ping = async function (req, res, next) { try { await db.getObject('config'); res.status(200).send(req.path === `${nconf.get('relative_path')}/sping` ? 'healthy' : '200'); - } catch (err) { + } catch (err: any) { next(err); } }; diff --git a/src/controllers/popular.ts b/src/controllers/popular.ts index 3869f35cfd..56904cb984 100644 --- a/src/controllers/popular.ts +++ b/src/controllers/popular.ts @@ -1,13 +1,12 @@ 'use strict'; -const nconf = require('nconf'); -const validator = require('validator'); +import nconf from 'nconf'; +import validator from 'validator'; +import helpers from './helpers'; +import recentController from './recent'; -const helpers = require('./helpers'); -const recentController = require('./recent'); - -const popularController = module.exports; +const popularController = {} as any; popularController.get = async function (req, res, next) { const data = await recentController.getData(req, 'popular', 'posts'); @@ -28,3 +27,5 @@ popularController.get = async function (req, res, next) { } res.render('popular', data); }; + +export default popularController; \ No newline at end of file diff --git a/src/controllers/posts.ts b/src/controllers/posts.ts index 128fdc130a..95a5d3d68d 100644 --- a/src/controllers/posts.ts +++ b/src/controllers/posts.ts @@ -1,12 +1,12 @@ + 'use strict'; -const querystring = require('querystring'); +import querystring from 'querystring'; +import posts from '../posts'; +import privileges from '../privileges'; +import helpers from './helpers'; -const posts = require('../posts'); -const privileges = require('../privileges'); -const helpers = require('./helpers'); - -const postsController = module.exports; +const postsController = {} as any; postsController.redirectToPost = async function (req, res, next) { const pid = parseInt(req.params.pid, 10); @@ -37,3 +37,5 @@ postsController.getRecentPosts = async function (req, res) { const data = await posts.getRecentPosts(req.uid, start, stop, req.params.term); res.json(data); }; + +export default postsController; \ No newline at end of file diff --git a/src/controllers/recent.ts b/src/controllers/recent.ts index 2c4a6252eb..2fe2aa94f9 100644 --- a/src/controllers/recent.ts +++ b/src/controllers/recent.ts @@ -1,16 +1,15 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import user from '../user'; +import topics from '../topics'; +import meta from '../meta'; +import helpers from './helpers'; +import pagination from '../pagination'; +import privileges from '../privileges'; -const user = require('../user'); -const topics = require('../topics'); -const meta = require('../meta'); -const helpers = require('./helpers'); -const pagination = require('../pagination'); -const privileges = require('../privileges'); - -const recentController = module.exports; +const recentController = {} as any; const relative_path = nconf.get('relative_path'); recentController.get = async function (req, res, next) { @@ -90,4 +89,6 @@ recentController.getData = async function (req, url, sort) { }; -require('../promisify')(recentController, ['get']); +import promisify from '../promisify'; +promisify(recentController, ['get']); +export default recentController; \ No newline at end of file diff --git a/src/controllers/search.ts b/src/controllers/search.ts index 75e0fc60a1..1326cc0d31 100644 --- a/src/controllers/search.ts +++ b/src/controllers/search.ts @@ -1,19 +1,18 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import db from '../database'; +import meta from '../meta'; +import plugins from '../plugins'; +import search from '../search'; +import categories from '../categories'; +import pagination from '../pagination'; +import privileges from '../privileges'; +import utils from '../utils'; +import helpers from './helpers'; -const db = require('../database'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const search = require('../search'); -const categories = require('../categories'); -const pagination = require('../pagination'); -const privileges = require('../privileges'); -const utils = require('../utils'); -const helpers = require('./helpers'); - -const searchController = module.exports; +const searchController = {} as any; searchController.search = async function (req, res, next) { if (!plugins.hooks.hasListeners('filter:search.query')) { @@ -143,3 +142,5 @@ async function buildCategories(uid, searchOnly) { { value: 'watched', text: '[[category:watched-categories]]' }, ].concat(categoriesData); } + +export default searchController; \ No newline at end of file diff --git a/src/controllers/sitemap.ts b/src/controllers/sitemap.ts index 7f1ac3dca9..e62aa61813 100644 --- a/src/controllers/sitemap.ts +++ b/src/controllers/sitemap.ts @@ -1,9 +1,9 @@ 'use strict'; -const sitemap = require('../sitemap'); -const meta = require('../meta'); +import sitemap from '../sitemap'; +import meta from '../meta'; -const sitemapController = module.exports; +const sitemapController = {} as any; sitemapController.render = async function (req, res, next) { if (meta.config['feeds:disableSitemap']) { @@ -38,3 +38,5 @@ async function sendSitemap(method, res, callback) { res.header('Content-Type', 'application/xml'); res.send(xml); } + +export default sitemapController; \ No newline at end of file diff --git a/src/controllers/tags.ts b/src/controllers/tags.ts index 3165303445..09dd5c148d 100644 --- a/src/controllers/tags.ts +++ b/src/controllers/tags.ts @@ -1,18 +1,17 @@ 'use strict'; -const validator = require('validator'); -const nconf = require('nconf'); +import validator from 'validator'; +import nconf from 'nconf'; +import meta from '../meta'; +import user from '../user'; +import categories from '../categories'; +import topics from '../topics'; +import privileges from '../privileges'; +import pagination from '../pagination'; +import utils from '../utils'; +import helpers from './helpers'; -const meta = require('../meta'); -const user = require('../user'); -const categories = require('../categories'); -const topics = require('../topics'); -const privileges = require('../privileges'); -const pagination = require('../pagination'); -const utils = require('../utils'); -const helpers = require('./helpers'); - -const tagsController = module.exports; +const tagsController = {} as any; tagsController.getTag = async function (req, res) { const tag = validator.escape(utils.cleanUpTag(req.params.tag, meta.config.maximumTagLength)); @@ -24,7 +23,7 @@ tagsController.getTag = async function (req, res) { tag: tag, breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]', url: '/tags' }, { text: tag }]), title: `[[pages:tag, ${tag}]]`, - }; + } as any; const [settings, cids, categoryData, canPost, isPrivileged] = await Promise.all([ user.getSettings(req.uid), cid || categories.getCidsByPrivilege('categories:cid', req.uid, 'topics:read'), @@ -83,3 +82,5 @@ tagsController.getTags = async function (req, res) { title: '[[pages:tags]]', }); }; + +export default tagsController; \ No newline at end of file diff --git a/src/controllers/top.ts b/src/controllers/top.ts index cc06e794c4..bcf2953c8f 100644 --- a/src/controllers/top.ts +++ b/src/controllers/top.ts @@ -1,13 +1,12 @@ 'use strict'; -const nconf = require('nconf'); -const validator = require('validator'); +import nconf from 'nconf'; +import validator from 'validator'; +import helpers from './helpers'; +import recentController from './recent'; -const helpers = require('./helpers'); -const recentController = require('./recent'); - -const topController = module.exports; +const topController = {} as any; topController.get = async function (req, res, next) { const data = await recentController.getData(req, 'top', 'votes'); @@ -26,3 +25,5 @@ topController.get = async function (req, res, next) { } res.render('top', data); }; + +export default topController; diff --git a/src/controllers/topics.ts b/src/controllers/topics.ts index a92570b8c8..3dcb004d24 100644 --- a/src/controllers/topics.ts +++ b/src/controllers/topics.ts @@ -1,20 +1,21 @@ 'use strict'; -const nconf = require('nconf'); -const qs = require('querystring'); +import nconf from 'nconf'; +import qs from 'querystring'; +import user from '../user'; +import meta from '../meta'; +import topics from '../topics'; +import categories from '../categories'; +import posts from '../posts'; +import privileges from '../privileges'; +import helpers from './helpers'; +import pagination from '../pagination'; +import utils from '../utils'; +import analytics from '../analytics'; +import path from 'path'; -const user = require('../user'); -const meta = require('../meta'); -const topics = require('../topics'); -const categories = require('../categories'); -const posts = require('../posts'); -const privileges = require('../privileges'); -const helpers = require('./helpers'); -const pagination = require('../pagination'); -const utils = require('../utils'); -const analytics = require('../analytics'); -const topicsController = module.exports; +const topicsController = {} as any; const url = nconf.get('url'); const relative_path = nconf.get('relative_path'); @@ -196,7 +197,7 @@ async function addOldCategory(topicData, userPrivileges) { async function addTags(topicData, req, res) { const postIndex = parseInt(req.params.post_index, 10) || 0; - const postAtIndex = topicData.posts.find(p => parseInt(p.index, 10) === parseInt(Math.max(0, postIndex - 1), 10)); + const postAtIndex = topicData.posts.find(p => parseInt(p.index, 10) === parseInt(String(Math.max(0, postIndex - 1)), 10)); let description = ''; if (postAtIndex && postAtIndex.content) { description = utils.stripHTMLTags(utils.decodeHTMLEntities(postAtIndex.content)); @@ -274,7 +275,6 @@ async function addOGImageTags(res, topicData, postAtIndex) { return upload; }); if (topicData.thumbs) { - const path = require('path'); const thumbs = topicData.thumbs.filter( t => t && images.every(img => path.normalize(img.name) !== path.normalize(url + t.url)) ); @@ -372,3 +372,5 @@ topicsController.pagination = async function (req, res, next) { res.json({ pagination: paginationData }); }; + +export default topicsController; \ No newline at end of file diff --git a/src/controllers/unread.ts b/src/controllers/unread.ts index 2f59f8e1ab..804c9df2d5 100644 --- a/src/controllers/unread.ts +++ b/src/controllers/unread.ts @@ -1,17 +1,16 @@ 'use strict'; -const nconf = require('nconf'); -const querystring = require('querystring'); +import nconf from 'nconf'; +import querystring from 'querystring'; +import meta from '../meta'; +import pagination from '../pagination'; +import user from '../user'; +import topics from '../topics'; +import helpers from './helpers'; +import privileges from '../privileges'; -const meta = require('../meta'); -const pagination = require('../pagination'); -const user = require('../user'); -const topics = require('../topics'); -const helpers = require('./helpers'); -const privileges = require('../privileges'); - -const unreadController = module.exports; +const unreadController = {} as any; const relative_path = nconf.get('relative_path'); unreadController.get = async function (req, res) { @@ -75,7 +74,9 @@ unreadController.unreadTotal = async function (req, res, next) { try { const unreadCount = await topics.getTotalUnread(req.uid, filter); res.json(unreadCount); - } catch (err) { + } catch (err: any) { next(err); } }; + +export default unreadController; \ No newline at end of file diff --git a/src/controllers/uploads.ts b/src/controllers/uploads.ts index 46871ca076..96032ab1b2 100644 --- a/src/controllers/uploads.ts +++ b/src/controllers/uploads.ts @@ -1,26 +1,23 @@ 'use strict'; -const path = require('path'); -const nconf = require('nconf'); -const validator = require('validator'); +import path from 'path'; +import nconf from 'nconf'; +import validator from 'validator'; +import user from '../user'; +import meta from '../meta'; +import file from '../file'; +import plugins from '../plugins'; +import image from '../image'; +import privileges from '../privileges'; +import helpers from './helpers'; -const user = require('../user'); -const meta = require('../meta'); -const file = require('../file'); -const plugins = require('../plugins'); -const image = require('../image'); -const privileges = require('../privileges'); - -const helpers = require('./helpers'); - -const uploadsController = module.exports; +const uploadsController = {} as any; uploadsController.upload = async function (req, res, filesIterator) { let files; try { files = req.files.files; - } catch (e) { - return helpers.formatApiResponse(400, res); +} catch (e: any) { return helpers.formatApiResponse(400, res); } // These checks added because of odd behaviour by request: https://github.com/request/request/issues/2445 @@ -41,7 +38,7 @@ uploadsController.upload = async function (req, res, filesIterator) { helpers.formatApiResponse(200, res, { images }); return images; - } catch (err) { + } catch (err: any) { return helpers.formatApiResponse(500, res, err); } finally { deleteTempFiles(files); @@ -200,4 +197,7 @@ function deleteTempFiles(files) { files.forEach(fileObj => file.delete(fileObj.path)); } -require('../promisify')(uploadsController, ['upload', 'uploadPost', 'uploadThumb']); +import promisify from '../promisify'; +promisify(uploadsController, ['upload', 'uploadPost', 'uploadThumb']); + +export default uploadsController; \ No newline at end of file diff --git a/src/controllers/user.ts b/src/controllers/user.ts index 6c924acf87..cb05202dad 100644 --- a/src/controllers/user.ts +++ b/src/controllers/user.ts @@ -1,10 +1,10 @@ 'use strict'; -const user = require('../user'); -const privileges = require('../privileges'); -const accountHelpers = require('./accounts/helpers'); +import user from '../user'; +import privileges from '../privileges'; +import accountHelpers from './accounts/helpers'; -const userController = module.exports; +const userController = {} as any; userController.getCurrentUser = async function (req, res) { if (!req.loggedIn) { @@ -76,6 +76,9 @@ userController.getUserDataByUID = async function (callerUid, uid) { return userData; }; -require('../promisify')(userController, [ +import promisify from '../promisify'; +promisify(userController, [ 'getCurrentUser', 'getUserByUID', 'getUserByUsername', 'getUserByEmail', ]); + +export default userController; \ No newline at end of file diff --git a/src/controllers/users.ts b/src/controllers/users.ts index 7506a8c8d3..f66f309d04 100644 --- a/src/controllers/users.ts +++ b/src/controllers/users.ts @@ -1,16 +1,15 @@ 'use strict'; -const user = require('../user'); -const meta = require('../meta'); +import user from '../user'; +import meta from '../meta'; +import db from '../database'; +import pagination from '../pagination'; +import privileges from '../privileges'; +import helpers from './helpers'; +import api from '../api'; +import utils from '../utils'; -const db = require('../database'); -const pagination = require('../pagination'); -const privileges = require('../privileges'); -const helpers = require('./helpers'); -const api = require('../api'); -const utils = require('../utils'); - -const usersController = module.exports; +const usersController = {} as any; usersController.index = async function (req, res, next) { const section = req.query.section || 'joindate'; @@ -116,7 +115,7 @@ usersController.getUsers = async function (set, uid, query) { setToData[set] = { title: '', crumb: '' }; } - const breadcrumbs = [{ text: setToData[set].crumb }]; + const breadcrumbs = [{ text: setToData[set].crumb }] as any[]; if (set !== 'users:joindate') { breadcrumbs.unshift({ text: '[[global:users]]', url: '/users' }); @@ -210,3 +209,5 @@ async function render(req, res, data) { res.append('X-Total-Count', data.userCount); res.render('users', data); } + +export default usersController; \ No newline at end of file diff --git a/src/controllers/write/admin.ts b/src/controllers/write/admin.ts index 8b9faa55ef..f51b6a797f 100644 --- a/src/controllers/write/admin.ts +++ b/src/controllers/write/admin.ts @@ -1,12 +1,11 @@ 'use strict'; -const meta = require('../../meta'); -const privileges = require('../../privileges'); -const analytics = require('../../analytics'); +import meta from '../../meta'; +import privileges from '../../privileges'; +import analytics from '../../analytics'; +import helpers from '../helpers'; -const helpers = require('../helpers'); - -const Admin = module.exports; +const Admin = {} as any; Admin.updateSetting = async (req, res) => { const ok = await privileges.admin.can('admin:settings', req.uid); @@ -40,3 +39,5 @@ Admin.getAnalyticsData = async (req, res) => { const getStats = req.query.units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet; helpers.formatApiResponse(200, res, await getStats(`analytics:${req.params.set}`, parseInt(req.query.until, 10) || Date.now(), req.query.amount)); }; + +export default Admin; \ No newline at end of file diff --git a/src/controllers/write/categories.ts b/src/controllers/write/categories.ts index 22250b931c..707784b7b9 100644 --- a/src/controllers/write/categories.ts +++ b/src/controllers/write/categories.ts @@ -1,12 +1,11 @@ 'use strict'; -const privileges = require('../../privileges'); -const categories = require('../../categories'); -const api = require('../../api'); +import privileges from '../../privileges'; +import categories from '../../categories'; +import api from '../../api'; +import helpers from '../helpers'; -const helpers = require('../helpers'); - -const Categories = module.exports; +const Categories = {} as any; const hasAdminPrivilege = async (uid) => { const ok = await privileges.admin.can(`admin:categories`, uid); @@ -80,3 +79,5 @@ Categories.setModerator = async (req, res) => { }); helpers.formatApiResponse(200, res); }; + +export default Categories; \ No newline at end of file diff --git a/src/controllers/write/chats.ts b/src/controllers/write/chats.ts index f009047a61..132540d3b5 100644 --- a/src/controllers/write/chats.ts +++ b/src/controllers/write/chats.ts @@ -1,11 +1,10 @@ 'use strict'; -const api = require('../../api'); -const messaging = require('../../messaging'); +import api from '../../api'; +import messaging from '../../messaging'; +import helpers from '../helpers'; -const helpers = require('../helpers'); - -const Chats = module.exports; +const Chats = {} as any; Chats.list = async (req, res) => { const page = (isFinite(req.query.page) && parseInt(req.query.page, 10)) || 1; @@ -127,3 +126,5 @@ Chats.messages.restore = async (req, res) => { helpers.formatApiResponse(200, res); }; + +export default Chats; \ No newline at end of file diff --git a/src/controllers/write/files.ts b/src/controllers/write/files.ts index 61a6320094..879849ad75 100644 --- a/src/controllers/write/files.ts +++ b/src/controllers/write/files.ts @@ -1,9 +1,9 @@ 'use strict'; -const fs = require('fs').promises; -const helpers = require('../helpers'); +import { promises as fs } from 'fs'; +import helpers from '../helpers'; -const Files = module.exports; +const Files = {} as any; Files.delete = async (req, res) => { await fs.unlink(res.locals.cleanedPath); @@ -14,3 +14,5 @@ Files.createFolder = async (req, res) => { await fs.mkdir(res.locals.folderPath); helpers.formatApiResponse(200, res); }; + +export default Files; diff --git a/src/controllers/write/flags.ts b/src/controllers/write/flags.ts index 3bda63888e..eec1741778 100644 --- a/src/controllers/write/flags.ts +++ b/src/controllers/write/flags.ts @@ -1,11 +1,11 @@ 'use strict'; -const user = require('../../user'); -const flags = require('../../flags'); -const api = require('../../api'); -const helpers = require('../helpers'); +import user from '../../user'; +import flags from '../../flags'; +import api from '../../api'; +import helpers from '../helpers'; -const Flags = module.exports; +const Flags = {} as any; Flags.create = async (req, res) => { const flagObj = await api.flags.create(req, { ...req.body }); @@ -51,3 +51,5 @@ Flags.deleteNote = async (req, res) => { helpers.formatApiResponse(200, res, payload); }; + +export default Flags; \ No newline at end of file diff --git a/src/controllers/write/groups.ts b/src/controllers/write/groups.ts index f4019cb075..4598c403c9 100644 --- a/src/controllers/write/groups.ts +++ b/src/controllers/write/groups.ts @@ -1,10 +1,9 @@ 'use strict'; -const api = require('../../api'); +import api from '../../api'; +import helpers from '../helpers'; -const helpers = require('../helpers'); - -const Groups = module.exports; +const Groups = {} as any; Groups.exists = async (req, res) => { helpers.formatApiResponse(200, res); @@ -47,3 +46,5 @@ Groups.rescind = async (req, res) => { await api.groups.rescind(req, req.params); helpers.formatApiResponse(200, res); }; + +export default Groups; diff --git a/src/controllers/write/index.ts b/src/controllers/write/index.ts index ad797c212c..a9f067659c 100644 --- a/src/controllers/write/index.ts +++ b/src/controllers/write/index.ts @@ -1,14 +1,27 @@ 'use strict'; -const Write = module.exports; +const Write = {} as any; -Write.users = require('./users'); -Write.groups = require('./groups'); -Write.categories = require('./categories'); -Write.topics = require('./topics'); -Write.posts = require('./posts'); -Write.chats = require('./chats'); -Write.flags = require('./flags'); -Write.admin = require('./admin'); -Write.files = require('./files'); -Write.utilities = require('./utilities'); +import users from './users'; +import groups from './groups'; +import categories from './categories'; +import topics from './topics'; +import posts from './posts'; +import chats from './chats'; +import admin from './admin'; +import files from './files'; +import utilities from './utilities'; +import flags from './flags'; + +Write.users = users; +Write.groups = groups; +Write.categories = categories; +Write.topics = topics; +Write.posts = posts; +Write.chats = chats; +Write.flags = flags; +Write.admin = admin; +Write.files = files; +Write.utilities = utilities; + +export default Write; diff --git a/src/controllers/write/posts.ts b/src/controllers/write/posts.ts index c9c8d21104..ddf6ec2830 100644 --- a/src/controllers/write/posts.ts +++ b/src/controllers/write/posts.ts @@ -1,13 +1,12 @@ 'use strict'; -const posts = require('../../posts'); -const privileges = require('../../privileges'); +import posts from '../../posts'; +import privileges from '../../privileges'; +import api from '../../api'; +import helpers from '../helpers'; +import * as apiHelpers from '../../api/helpers'; -const api = require('../../api'); -const helpers = require('../helpers'); -const apiHelpers = require('../../api/helpers'); - -const Posts = module.exports; +const Posts = {} as any; Posts.get = async (req, res) => { helpers.formatApiResponse(200, res, await api.posts.get(req, { pid: req.params.pid })); @@ -114,3 +113,5 @@ Posts.deleteDiff = async (req, res) => { helpers.formatApiResponse(200, res, await api.posts.getDiffs(req, { ...req.params })); }; + +export default Posts; \ No newline at end of file diff --git a/src/controllers/write/topics.ts b/src/controllers/write/topics.ts index d0f860680f..aff1ce8f7c 100644 --- a/src/controllers/write/topics.ts +++ b/src/controllers/write/topics.ts @@ -1,16 +1,14 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import api from '../../api'; +import topics from '../../topics'; +import privileges from '../../privileges'; +import helpers from '../helpers'; +import middleware from '../../middleware'; +import uploadsController from '../uploads'; -const api = require('../../api'); -const topics = require('../../topics'); -const privileges = require('../../privileges'); - -const helpers = require('../helpers'); -const middleware = require('../../middleware'); -const uploadsController = require('../uploads'); - -const Topics = module.exports; +const Topics = {} as any; Topics.get = async (req, res) => { helpers.formatApiResponse(200, res, await api.topics.get(req, req.params)); @@ -219,3 +217,5 @@ Topics.deleteEvent = async (req, res) => { await topics.events.purge(req.params.tid, [req.params.eventId]); helpers.formatApiResponse(200, res); }; + +export default Topics; \ No newline at end of file diff --git a/src/controllers/write/users.ts b/src/controllers/write/users.ts index 2610de5d1d..b0141ae7eb 100644 --- a/src/controllers/write/users.ts +++ b/src/controllers/write/users.ts @@ -1,22 +1,20 @@ 'use strict'; -const util = require('util'); -const nconf = require('nconf'); -const path = require('path'); -const crypto = require('crypto'); -const fs = require('fs').promises; +import util from 'util'; +import nconf from 'nconf'; +import path from 'path'; +import crypto from 'crypto'; +import { promises as fs } from 'fs'; +import db from '../../database'; +import api from '../../api'; +import groups from '../../groups'; +import meta from '../../meta'; +import privileges from '../../privileges'; +import user from '../../user'; +import utils from '../../utils'; +import helpers from '../helpers'; -const db = require('../../database'); -const api = require('../../api'); -const groups = require('../../groups'); -const meta = require('../../meta'); -const privileges = require('../../privileges'); -const user = require('../../user'); -const utils = require('../../utils'); - -const helpers = require('../helpers'); - -const Users = module.exports; +const Users = {} as any; const exportMetadata = new Map([ ['posts', ['csv', 'text/csv']], @@ -181,7 +179,7 @@ Users.revokeSession = async (req, res) => { let _id; for (const sid of sids) { /* eslint-disable no-await-in-loop */ - const sessionObj = await getSessionAsync(sid); + const sessionObj: any = await getSessionAsync(sid); if (sessionObj && sessionObj.meta && sessionObj.meta.uuid === req.params.uuid) { _id = sid; break; @@ -316,8 +314,7 @@ const prepareExport = async (req, res) => { res.set('ETag', `"${crypto.createHash('md5').update(String(stat.mtimeMs)).digest('hex')}"`); res.status(204); return true; - } catch (e) { - res.status(404); +} catch (e: any) { res.status(404); return false; } }; @@ -354,3 +351,5 @@ Users.generateExportsByType = async (req, res) => { await api.users.generateExport(req, req.params); helpers.formatApiResponse(202, res); }; + +export default Users; \ No newline at end of file diff --git a/src/controllers/write/utilities.ts b/src/controllers/write/utilities.ts index 27df1b2ad7..d9a05f5845 100644 --- a/src/controllers/write/utilities.ts +++ b/src/controllers/write/utilities.ts @@ -1,10 +1,10 @@ 'use strict'; -const user = require('../../user'); -const authenticationController = require('../authentication'); -const helpers = require('../helpers'); +import user from '../../user'; +import authenticationController from '../authentication'; +import helpers from '../helpers'; -const Utilities = module.exports; +const Utilities = {} as any; Utilities.ping = {}; Utilities.ping.get = (req, res) => { @@ -31,3 +31,5 @@ Utilities.login = (req, res) => { authenticationController.login(req, res); }; + +export default Utilities; \ No newline at end of file diff --git a/src/coverPhoto.ts b/src/coverPhoto.ts index cf8163fe40..341f9bb47a 100644 --- a/src/coverPhoto.ts +++ b/src/coverPhoto.ts @@ -1,12 +1,12 @@ 'use strict'; -const nconf = require('nconf'); -const meta = require('./meta'); +import nconf from 'nconf'; +import meta from './meta'; const relative_path = nconf.get('relative_path'); -const coverPhoto = module.exports; +const coverPhoto = {} as any; coverPhoto.getDefaultGroupCover = function (groupName) { return getCover('groups', groupName); @@ -38,3 +38,5 @@ function getCover(type, id) { return defaultCover; } + +export default coverPhoto; \ No newline at end of file diff --git a/src/database/cache.ts b/src/database/cache.ts index 07974e9f3b..30add17baf 100644 --- a/src/database/cache.ts +++ b/src/database/cache.ts @@ -1,7 +1,8 @@ 'use strict'; -module.exports.create = function (name) { - const cacheCreate = require('../cache/lru'); +import cacheCreate from '../cache/lru'; + +export const create = function (name) { return cacheCreate({ name: `${name}-object`, max: 40000, diff --git a/src/database/helpers.ts b/src/database/helpers.ts index 2717428e2c..16ba9d52f0 100644 --- a/src/database/helpers.ts +++ b/src/database/helpers.ts @@ -1,6 +1,6 @@ 'use strict'; -const helpers = module.exports; +const helpers = {} as any; helpers.mergeBatch = function (batchData, start, stop, sort) { function getFirst() { @@ -19,10 +19,12 @@ helpers.mergeBatch = function (batchData, start, stop, sort) { let item = null; const result = []; do { - item = getFirst(batchData); + item = getFirst(); if (item) { result.push(item); } } while (item && (result.length < (stop - start + 1) || stop === -1)); return result; }; + +export default helpers; \ No newline at end of file diff --git a/src/database/index.ts b/src/database/index.ts index 51febea19d..9732eaa0d1 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -1,16 +1,16 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import * as winston from 'winston'; +const databaseName = nconf.get('database') || 'mongo'; -const databaseName = nconf.get('database'); -const winston = require('winston'); if (!databaseName) { winston.error(new Error('Database type not set! Run ./nodebb setup')); - process.exit(); + (process as any).exit(); } -const primaryDB = require(`./${databaseName}`); +const primaryDB = require(`./${databaseName}`).default; primaryDB.parseIntFields = function (data, intFields, requestedFields) { intFields.forEach((field) => { @@ -25,13 +25,13 @@ primaryDB.initSessionStore = async function () { let sessionStoreDB = primaryDB; if (nconf.get('session_store')) { - sessionStoreDB = require(`./${sessionStoreConfig.name}`); + sessionStoreDB = require(`./${sessionStoreConfig.name}`).default; } else if (nconf.get('redis')) { // if redis is specified, use it as session store over others - sessionStoreDB = require('./redis'); + sessionStoreDB = require('./redis'); } primaryDB.sessionStore = await sessionStoreDB.createSessionStore(sessionStoreConfig); }; -module.exports = primaryDB; +export default primaryDB; diff --git a/src/database/mongo.ts b/src/database/mongo.ts index c4a6c0836c..b89a709638 100644 --- a/src/database/mongo.ts +++ b/src/database/mongo.ts @@ -2,17 +2,28 @@ 'use strict'; -const winston = require('winston'); -const nconf = require('nconf'); -const semver = require('semver'); -const prompt = require('prompt'); -const utils = require('../utils'); +import winston from 'winston'; +import nconf from 'nconf'; +import semver from 'semver'; +import prompt from 'prompt'; +import utils from '../utils'; +import main from './mongo/main'; +import hash from './mongo/hash'; +import sets from './mongo/sets'; +import sorted from './mongo/sets'; +import list from './mongo/list'; +import transaction from './mongo/transaction'; +import MongoStore from 'connect-mongo'; +import meta from '../meta'; +//@ts-ignore +import mongoPkg from 'mongodb/package.json'; + let client; -const connection = require('./mongo/connection'); +import connection from './mongo/connection'; -const mongoModule = module.exports; +const mongoModule = {} as any; function isUriNotSpecified() { return !prompt.history('mongo:uri').value; @@ -65,9 +76,6 @@ mongoModule.init = async function () { }; mongoModule.createSessionStore = async function (options) { - const MongoStore = require('connect-mongo'); - const meta = require('../meta'); - const store = MongoStore.create({ clientPromise: connection.connect(options), ttl: meta.getSessionTTLSeconds(), @@ -91,7 +99,6 @@ mongoModule.createIndices = async function () { }; mongoModule.checkCompatibility = function (callback) { - const mongoPkg = require('mongodb/package.json'); mongoModule.checkCompatibilityVersion(mongoPkg.version, callback); }; @@ -114,7 +121,7 @@ mongoModule.info = async function (db) { async function getServerStatus() { try { return await db.command({ serverStatus: 1 }); - } catch (err) { + } catch (err: any) { serverStatusError = err.message; // Override mongo error with more human-readable error if (err.name === 'MongoError' && err.codeName === 'Unauthorized') { @@ -178,11 +185,14 @@ mongoModule.close = function (callback) { client.close(err => callback(err)); }; -require('./mongo/main')(mongoModule); -require('./mongo/hash')(mongoModule); -require('./mongo/sets')(mongoModule); -require('./mongo/sorted')(mongoModule); -require('./mongo/list')(mongoModule); -require('./mongo/transaction')(mongoModule); +main(mongoModule); +hash(mongoModule); +sets(mongoModule); +sorted(mongoModule); +list(mongoModule); +transaction(mongoModule); -require('../promisify')(mongoModule, ['client', 'sessionStore']); +import promisify from '../promisify'; +promisify(mongoModule, ['client', 'sessionStore']); + +export default mongoModule; \ No newline at end of file diff --git a/src/database/mongo/connection.ts b/src/database/mongo/connection.ts index 2f5d64e714..4975200e49 100644 --- a/src/database/mongo/connection.ts +++ b/src/database/mongo/connection.ts @@ -1,11 +1,12 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import winston from 'winston'; +import _ from 'lodash'; +import mongoClient from 'mongodb'; -const winston = require('winston'); -const _ = require('lodash'); -const connection = module.exports; +const connection = {} as any; connection.getConnectionString = function (mongo) { mongo = mongo || nconf.get('mongo'); @@ -53,10 +54,9 @@ connection.getConnectionOptions = function (mongo) { }; connection.connect = async function (options) { - const mongoClient = require('mongodb').MongoClient; - const connString = connection.getConnectionString(options); const connOptions = connection.getConnectionOptions(options); - return await mongoClient.connect(connString, connOptions); + return await (mongoClient as any).connect(connString, connOptions); }; +export default connection; \ No newline at end of file diff --git a/src/database/mongo/hash.ts b/src/database/mongo/hash.ts index ec9cfa051b..9a6050a1e8 100644 --- a/src/database/mongo/hash.ts +++ b/src/database/mongo/hash.ts @@ -1,11 +1,12 @@ 'use strict'; +import helpers from './helpers'; +import * as cache from '../cache'; -module.exports = function (module) { - const helpers = require('./helpers'); - const cache = require('../cache').create('mongo'); +export default function (module) { + const cacheCreate = (cache as any).create('mongo'); - module.objectCache = cache; + module.objectCache = cacheCreate; module.setObject = async function (key, data) { const isArray = Array.isArray(key); @@ -25,14 +26,14 @@ module.exports = function (module) { } else { await module.client.collection('objects').updateOne({ _key: key }, { $set: writeData }, { upsert: true }); } - } catch (err) { + } catch (err: any) { if (err && err.message.startsWith('E11000 duplicate key error')) { return await module.setObject(key, data); } throw err; } - cache.del(key); + cacheCreate.del(key); }; module.setObjectBulk = async function (...args) { @@ -60,14 +61,14 @@ module.exports = function (module) { if (bulk) { await bulk.execute(); } - } catch (err) { + } catch (err: any) { if (err && err.message.startsWith('E11000 duplicate key error')) { return await module.setObjectBulk(data); } throw err; } - cache.del(data.map(item => item[0])); + cacheCreate.del(data.map(item => item[0])); }; module.setObjectField = async function (key, field, value) { @@ -97,7 +98,7 @@ module.exports = function (module) { return null; } const cachedData = {}; - cache.getUnCachedKeys([key], cachedData); + cacheCreate.getUnCachedKeys([key], cachedData); if (cachedData[key]) { return cachedData[key].hasOwnProperty(field) ? cachedData[key][field] : null; } @@ -122,7 +123,7 @@ module.exports = function (module) { return []; } const cachedData = {}; - const unCachedKeys = cache.getUnCachedKeys(keys, cachedData); + const unCachedKeys = cacheCreate.getUnCachedKeys(keys, cachedData); let data = []; if (unCachedKeys.length >= 1) { data = await module.client.collection('objects').find( @@ -135,7 +136,7 @@ module.exports = function (module) { const map = helpers.toMap(data); unCachedKeys.forEach((key) => { cachedData[key] = map[key] || null; - cache.set(key, cachedData[key]); + cacheCreate.set(key, cachedData[key]); }); if (!Array.isArray(fields) || !fields.length) { @@ -208,7 +209,7 @@ module.exports = function (module) { await module.client.collection('objects').updateOne({ _key: key }, { $unset: data }); } - cache.del(key); + cacheCreate.del(key); }; module.incrObjectField = async function (key, field) { @@ -235,7 +236,7 @@ module.exports = function (module) { bulk.find({ _key: key }).upsert().update({ $inc: increment }); }); await bulk.execute(); - cache.del(key); + cacheCreate.del(key); const result = await module.getObjectsFields(key, [field]); return result.map(data => data && data[field]); } @@ -248,9 +249,9 @@ module.exports = function (module) { returnDocument: 'after', upsert: true, }); - cache.del(key); + cacheCreate.del(key); return result && result.value ? result.value[field] : null; - } catch (err) { + } catch (err: any) { // if there is duplicate key error retry the upsert // https://github.com/NodeBB/NodeBB/issues/4467 // https://jira.mongodb.org/browse/SERVER-14322 @@ -277,6 +278,6 @@ module.exports = function (module) { bulk.find({ _key: item[0] }).upsert().update({ $inc: increment }); }); await bulk.execute(); - cache.del(data.map(item => item[0])); + cacheCreate.del(data.map(item => item[0])); }; }; diff --git a/src/database/mongo/helpers.ts b/src/database/mongo/helpers.ts index 4259771b2e..4523739e73 100644 --- a/src/database/mongo/helpers.ts +++ b/src/database/mongo/helpers.ts @@ -1,7 +1,8 @@ 'use strict'; -const helpers = module.exports; -const utils = require('../../utils'); +import utils from '../../utils'; + +const helpers = {} as any; helpers.noop = function () {}; @@ -65,3 +66,5 @@ helpers.buildMatchQuery = function (match) { } return _match; }; + +export default helpers; diff --git a/src/database/mongo/list.ts b/src/database/mongo/list.ts index e23b86bee4..d1432004ab 100644 --- a/src/database/mongo/list.ts +++ b/src/database/mongo/list.ts @@ -1,7 +1,24 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); + + +export default function (module) { + async function listPush(key, values, position?) { + values = values.map(helpers.valueToString); + await module.client.collection('objects').updateOne({ + _key: key, + }, { + $push: { + array: { + $each: values, + ...(position || {}), + }, + }, + }, { + upsert: true, + }); + } module.listPrepend = async function (key, value) { if (!key) { @@ -25,21 +42,6 @@ module.exports = function (module) { await listPush(key, value); }; - async function listPush(key, values, position) { - values = values.map(helpers.valueToString); - await module.client.collection('objects').updateOne({ - _key: key, - }, { - $push: { - array: { - $each: values, - ...(position || {}), - }, - }, - }, { - upsert: true, - }); - } module.listRemoveLast = async function (key) { if (!key) { diff --git a/src/database/mongo/main.ts b/src/database/mongo/main.ts index e7b961a30c..1f940aa44c 100644 --- a/src/database/mongo/main.ts +++ b/src/database/mongo/main.ts @@ -1,7 +1,8 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); + +export default function(module) { module.flushdb = async function () { await module.client.dropDatabase(); }; diff --git a/src/database/mongo/sets.ts b/src/database/mongo/sets.ts index c4b9615c9e..84540b3ddf 100644 --- a/src/database/mongo/sets.ts +++ b/src/database/mongo/sets.ts @@ -1,8 +1,10 @@ 'use strict'; -module.exports = function (module) { - const _ = require('lodash'); - const helpers = require('./helpers'); +import _ from 'lodash'; +import helpers from './helpers'; + +export default function (module) { + module.setAdd = async function (key, value) { if (!Array.isArray(value)) { @@ -50,7 +52,7 @@ module.exports = function (module) { } try { await bulk.execute(); - } catch (err) { + } catch (err: any) { if (err && err.message.startsWith('E11000 duplicate key error')) { return await module.setsAdd(keys, value); } diff --git a/src/database/mongo/sorted.ts b/src/database/mongo/sorted.ts index 16bc5f2154..cebc745916 100644 --- a/src/database/mongo/sorted.ts +++ b/src/database/mongo/sorted.ts @@ -1,19 +1,23 @@ 'use strict'; -const _ = require('lodash'); -const utils = require('../../utils'); +import _ from 'lodash'; +import utils from '../../utils'; +import helpers from './helpers'; +import dbHelpers from '../helpers'; +import util from 'util'; +import add from './sorted/add'; +import remove from './sorted/remove'; +import union from './sorted/union'; +import intersect from './sorted/intersect'; +import * as batch from '../../batch'; -module.exports = function (module) { - const helpers = require('./helpers'); - const dbHelpers = require('../helpers'); - const util = require('util'); +export default function (module) { const sleep = util.promisify(setTimeout); - - require('./sorted/add')(module); - require('./sorted/remove')(module); - require('./sorted/union')(module); - require('./sorted/intersect')(module); + add(module); + remove(module); + union(module); + intersect(module); module.getSortedSetRange = async function (key, start, stop) { return await getSortedSetRange(key, start, stop, '-inf', '+inf', 1, false); @@ -39,7 +43,7 @@ module.exports = function (module) { if ((start < 0 && start > stop) || (isArray && !key.length)) { return []; } - const query = { _key: key }; + const query = { _key: key } as any; if (isArray) { if (key.length > 1) { query._key = { $in: key }; @@ -60,7 +64,7 @@ module.exports = function (module) { query.score = max; } - const fields = { _id: 0, _key: 0 }; + const fields = { _id: 0, _key: 0 } as any; if (!withScores) { fields.score = 0; } @@ -82,7 +86,7 @@ module.exports = function (module) { limit = 0; } - let result = []; + let result = [] as any[]; async function doQuery(_key, fields, skip, limit) { return await module.client.collection('objects').find({ ...query, ...{ _key: _key } }, { projection: fields }) .sort({ score: sort }) @@ -93,7 +97,6 @@ module.exports = function (module) { if (isArray && key.length > 100) { const batches = []; - const batch = require('../../batch'); const batchSize = Math.ceil(key.length / Math.ceil(key.length / 100)); await batch.processArray(key, async currentBatch => batches.push(currentBatch), { batch: batchSize }); const batchData = await Promise.all(batches.map( @@ -146,7 +149,7 @@ module.exports = function (module) { return; } - const query = { _key: key }; + const query = { _key: key } as any; if (min !== '-inf') { query.score = { $gte: min }; } @@ -372,7 +375,7 @@ module.exports = function (module) { return []; } const arrayOfKeys = keys.length > 1; - const projection = { _id: 0, value: 1 }; + const projection = { _id: 0, value: 1 } as any; if (arrayOfKeys) { projection._key = 1; } @@ -396,7 +399,7 @@ module.exports = function (module) { if (!key) { return; } - const data = {}; + const data = {} as any; value = helpers.valueToString(value); data.score = parseFloat(increment); @@ -411,7 +414,7 @@ module.exports = function (module) { upsert: true, }); return result && result.value ? result.value.score : null; - } catch (err) { + } catch (err: any) { // if there is duplicate key error retry the upsert // https://github.com/NodeBB/NodeBB/issues/4467 // https://jira.mongodb.org/browse/SERVER-14322 @@ -503,7 +506,7 @@ module.exports = function (module) { } module.getSortedSetScan = async function (params) { - const project = { _id: 0, value: 1 }; + const project = { _id: 0, value: 1 } as any; if (params.withScores) { project.score = 1; } @@ -512,7 +515,7 @@ module.exports = function (module) { let regex; try { regex = new RegExp(match); - } catch (err) { + } catch (err: any) { return []; } @@ -534,7 +537,7 @@ module.exports = function (module) { module.processSortedSet = async function (setKey, processFn, options) { let done = false; const ids = []; - const project = { _id: 0, _key: 0 }; + const project = { _id: 0, _key: 0 } as any; if (!options.withScores) { project.score = 0; diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.ts similarity index 95% rename from src/database/mongo/sorted/add.js rename to src/database/mongo/sorted/add.ts index 13ee427c23..28321d8b90 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.ts @@ -1,9 +1,8 @@ 'use strict'; +import helpers from '../helpers'; +import utils from '../../../utils'; -module.exports = function (module) { - const helpers = require('../helpers'); - const utils = require('../../../utils'); - +export default function (module) { module.sortedSetAdd = async function (key, score, value) { if (!key) { return; @@ -18,7 +17,7 @@ module.exports = function (module) { try { await module.client.collection('objects').updateOne({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true }); - } catch (err) { + } catch (err: any) { if (err && err.message.startsWith('E11000 duplicate key error')) { return await module.sortedSetAdd(key, score, value); } diff --git a/src/database/mongo/sorted/intersect.js b/src/database/mongo/sorted/intersect.ts similarity index 93% rename from src/database/mongo/sorted/intersect.js rename to src/database/mongo/sorted/intersect.ts index a91388539c..5f772fb02c 100644 --- a/src/database/mongo/sorted/intersect.js +++ b/src/database/mongo/sorted/intersect.ts @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { module.sortedSetIntersectCard = async function (keys) { if (!Array.isArray(keys) || !keys.length) { return 0; @@ -25,7 +25,7 @@ module.exports = function (module) { } }; - async function countSets(sets, limit) { + async function countSets(sets, limit?) { const objects = module.client.collection('objects'); const counts = await Promise.all( sets.map(s => objects.countDocuments({ _key: s }, { @@ -88,7 +88,7 @@ module.exports = function (module) { cursorSmall.batchSize(params.counts.minCount + 1); } let items = await cursorSmall.toArray(); - const project = { _id: 0, value: 1 }; + const project = { _id: 0, value: 1 } as any; if (params.withScores) { project.score = 1; } @@ -114,7 +114,7 @@ module.exports = function (module) { } async function intersectBatch(params) { - const project = { _id: 0, value: 1 }; + const project = { _id: 0, value: 1 } as any; if (params.withScores) { project.score = 1; } @@ -126,11 +126,11 @@ module.exports = function (module) { .batchSize(batchSize); const otherSets = params.sets.filter(s => s !== sortSet); - let inters = []; + let inters = [] as any[]; let done = false; while (!done) { /* eslint-disable no-await-in-loop */ - const items = []; + const items = [] as any[]; while (items.length < batchSize) { const nextItem = await cursor.next(); if (!nextItem) { @@ -161,14 +161,14 @@ module.exports = function (module) { } async function intersectAggregate(params) { - const aggregate = {}; + const aggregate = {} as any; if (params.aggregate) { aggregate[`$${params.aggregate.toLowerCase()}`] = '$score'; } else { aggregate.$sum = '$score'; } - const pipeline = [{ $match: { _key: { $in: params.sets } } }]; + const pipeline = [{ $match: { _key: { $in: params.sets } } }] as any[]; params.weights.forEach((weight, index) => { if (weight !== 1) { @@ -203,7 +203,7 @@ module.exports = function (module) { pipeline.push({ $limit: params.limit }); } - const project = { _id: 0, value: '$_id.value' }; + const project = { _id: 0, value: '$_id.value' } as any; if (params.withScores) { project.score = '$totalScore'; } diff --git a/src/database/mongo/sorted/remove.js b/src/database/mongo/sorted/remove.ts similarity index 92% rename from src/database/mongo/sorted/remove.js rename to src/database/mongo/sorted/remove.ts index d6bf96fa7e..bcab20f0ac 100644 --- a/src/database/mongo/sorted/remove.js +++ b/src/database/mongo/sorted/remove.ts @@ -1,7 +1,7 @@ 'use strict'; +import helpers from '../helpers'; -module.exports = function (module) { - const helpers = require('../helpers'); +export default function (module) { module.sortedSetRemove = async function (key, value) { if (!key) { @@ -37,7 +37,7 @@ module.exports = function (module) { if (!Array.isArray(keys) || !keys.length) { return; } - const query = { _key: { $in: keys } }; + const query = { _key: { $in: keys } } as any; if (keys.length === 1) { query._key = keys[0]; } diff --git a/src/database/mongo/sorted/union.js b/src/database/mongo/sorted/union.ts similarity index 92% rename from src/database/mongo/sorted/union.js rename to src/database/mongo/sorted/union.ts index ea4ad4d8e1..91671c3d9b 100644 --- a/src/database/mongo/sorted/union.js +++ b/src/database/mongo/sorted/union.ts @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { module.sortedSetUnionCard = async function (keys) { if (!Array.isArray(keys) || !keys.length) { return 0; @@ -33,7 +33,7 @@ module.exports = function (module) { limit = 0; } - const aggregate = {}; + const aggregate = {} as any; if (params.aggregate) { aggregate[`$${params.aggregate.toLowerCase()}`] = '$score'; } else { @@ -44,7 +44,7 @@ module.exports = function (module) { { $match: { _key: { $in: params.sets } } }, { $group: { _id: { value: '$value' }, totalScore: aggregate } }, { $sort: { totalScore: params.sort } }, - ]; + ] as any[]; if (params.start) { pipeline.push({ $skip: params.start }); @@ -54,7 +54,7 @@ module.exports = function (module) { pipeline.push({ $limit: limit }); } - const project = { _id: 0, value: '$_id.value' }; + const project = { _id: 0, value: '$_id.value' } as any; if (params.withScores) { project.score = '$totalScore'; } diff --git a/src/database/mongo/transaction.ts b/src/database/mongo/transaction.ts index f914a2dfca..38dcdc6513 100644 --- a/src/database/mongo/transaction.ts +++ b/src/database/mongo/transaction.ts @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { // TODO module.transaction = function (perform, callback) { perform(module.client, callback); diff --git a/src/database/postgres.ts b/src/database/postgres.ts index e0ff91bd04..5f95f9a7e5 100644 --- a/src/database/postgres.ts +++ b/src/database/postgres.ts @@ -1,14 +1,27 @@ 'use strict'; -const winston = require('winston'); -const async = require('async'); -const nconf = require('nconf'); -const session = require('express-session'); -const semver = require('semver'); +import winston from 'winston'; +import async from 'async'; +import nconf from 'nconf'; +import session from 'express-session'; +import semver from 'semver'; +import connection from './postgres/connection'; +import main from './postgres/main'; +import hash from './postgres/hash'; +import sets from './postgres/sets'; +import sorted from './postgres/sets'; +import list from './postgres/list'; +import transaction from './postgres/transaction'; +//@ts-ignore +import postgresPkg from 'pg/package.json'; +import meta from '../meta'; +import connectPgSimple from 'connect-pg-simple'; +import { Pool } from 'pg'; -const connection = require('./postgres/connection'); -const postgresModule = module.exports; + + +const postgresModule = {} as any; postgresModule.questions = [ { @@ -46,7 +59,6 @@ postgresModule.questions = [ ]; postgresModule.init = async function () { - const { Pool } = require('pg'); const connOptions = connection.getConnectionOptions(); const pool = new Pool(connOptions); postgresModule.pool = pool; @@ -54,7 +66,7 @@ postgresModule.init = async function () { const client = await pool.connect(); try { await checkUpgrade(client); - } catch (err) { + } catch (err: any) { winston.error(`NodeBB could not connect to your PostgreSQL database. PostgreSQL returned the following error: ${err.message}`); throw err; } finally { @@ -290,10 +302,9 @@ PARALLEL SAFE`); } postgresModule.createSessionStore = async function (options) { - const meta = require('../meta'); function done(db) { - const sessionStore = require('connect-pg-simple')(session); + const sessionStore = connectPgSimple(session); return new sessionStore({ pool: db, ttl: meta.getSessionTTLSeconds(), @@ -348,7 +359,6 @@ postgresModule.createIndices = function (callback) { }; postgresModule.checkCompatibility = function (callback) { - const postgresPkg = require('pg/package.json'); postgresModule.checkCompatibilityVersion(postgresPkg.version, callback); }; @@ -380,11 +390,13 @@ postgresModule.close = async function () { await postgresModule.pool.end(); }; -require('./postgres/main')(postgresModule); -require('./postgres/hash')(postgresModule); -require('./postgres/sets')(postgresModule); -require('./postgres/sorted')(postgresModule); -require('./postgres/list')(postgresModule); -require('./postgres/transaction')(postgresModule); +main(postgresModule); +hash(postgresModule); +sets(postgresModule); +sorted(postgresModule); +list(postgresModule); +transaction(postgresModule); -require('../promisify')(postgresModule, ['client', 'sessionStore', 'pool', 'transaction']); +import promisify from '../promisify'; +promisify(postgresModule, ['client', 'sessionStore', 'pool', 'transaction']); +export default postgresModule; \ No newline at end of file diff --git a/src/database/postgres/connection.ts b/src/database/postgres/connection.ts index 54cdc5ebee..69956c457c 100644 --- a/src/database/postgres/connection.ts +++ b/src/database/postgres/connection.ts @@ -1,10 +1,12 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); -const _ = require('lodash'); +import nconf from 'nconf'; +import winston from 'winston'; +import _ from 'lodash'; +import { Pool } from 'pg'; -const connection = module.exports; + +const connection = {} as any; connection.getConnectionOptions = function (postgres) { postgres = postgres || nconf.get('postgres'); @@ -34,11 +36,12 @@ connection.getConnectionOptions = function (postgres) { }; connection.connect = async function (options) { - const { Pool } = require('pg'); const connOptions = connection.getConnectionOptions(options); const db = new Pool(connOptions); await db.connect(); return db; }; -require('../../promisify')(connection); +import promisify from '../../promisify'; +promisify(connection); +export default connection; \ No newline at end of file diff --git a/src/database/postgres/hash.ts b/src/database/postgres/hash.ts index ced3207822..edb1d5caf7 100644 --- a/src/database/postgres/hash.ts +++ b/src/database/postgres/hash.ts @@ -1,7 +1,7 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); +export default function (module) { module.setObject = async function (key, data) { if (!key || !data) { diff --git a/src/database/postgres/helpers.ts b/src/database/postgres/helpers.ts index 85e0b63d07..960cb439a7 100644 --- a/src/database/postgres/helpers.ts +++ b/src/database/postgres/helpers.ts @@ -1,6 +1,6 @@ 'use strict'; -const helpers = module.exports; +const helpers = {} as any; helpers.valueToString = function (value) { return String(value); @@ -95,3 +95,5 @@ SELECT "_key", "type" }; helpers.noop = function () {}; + +export default helpers; \ No newline at end of file diff --git a/src/database/postgres/list.ts b/src/database/postgres/list.ts index 885adb3825..37ea5ee63f 100644 --- a/src/database/postgres/list.ts +++ b/src/database/postgres/list.ts @@ -1,7 +1,7 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); +export default function (module) { module.listPrepend = async function (key, value) { if (!key) { diff --git a/src/database/postgres/main.ts b/src/database/postgres/main.ts index ebb2c7a0cc..bb4222ed74 100644 --- a/src/database/postgres/main.ts +++ b/src/database/postgres/main.ts @@ -1,7 +1,8 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); + +export default function (module) { module.flushdb = async function () { await module.pool.query(`DROP SCHEMA "public" CASCADE`); diff --git a/src/database/postgres/sets.ts b/src/database/postgres/sets.ts index 82c3f16aff..72487a2928 100644 --- a/src/database/postgres/sets.ts +++ b/src/database/postgres/sets.ts @@ -1,9 +1,10 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); + +export default function (module) { module.setAdd = async function (key, value) { if (!Array.isArray(value)) { diff --git a/src/database/postgres/sorted.ts b/src/database/postgres/sorted.ts index 06d007ca05..e384df9442 100644 --- a/src/database/postgres/sorted.ts +++ b/src/database/postgres/sorted.ts @@ -1,16 +1,23 @@ 'use strict'; -module.exports = function (module) { - const helpers = require('./helpers'); - const util = require('util'); - const Cursor = require('pg-cursor'); - Cursor.prototype.readAsync = util.promisify(Cursor.prototype.read); +import helpers from './helpers'; +import util from 'util'; +import Cursor from 'pg-cursor' + +import add from './sorted/add'; +import remove from './sorted/remove'; +import sorted from './sorted/union'; +import intersect from './sorted/intersect'; + +export default function (module) { +; + (Cursor as any).prototype.readAsync = util.promisify(Cursor.prototype.read); const sleep = util.promisify(setTimeout); - require('./sorted/add')(module); - require('./sorted/remove')(module); - require('./sorted/union')(module); - require('./sorted/intersect')(module); + add(module); + remove(module); + sorted(module); + intersect(module); module.getSortedSetRange = async function (key, start, stop) { return await getSortedSetRange(key, start, stop, 1, false); @@ -651,7 +658,7 @@ SELECT z."value", z."score" WHERE o."_key" = $1::TEXT ORDER BY z."score" ASC, z."value" ASC`, [setKey])); - if (process && process.constructor && process.constructor.name !== 'AsyncFunction') { + if (process && (process as any).constructor && (process as any).constructor.name !== 'AsyncFunction') { process = util.promisify(process); } @@ -670,7 +677,7 @@ SELECT z."value", z."score" } try { await process(rows); - } catch (err) { + } catch (err: any) { await client.release(); throw err; } diff --git a/src/database/postgres/sorted/add.js b/src/database/postgres/sorted/add.ts similarity index 96% rename from src/database/postgres/sorted/add.js rename to src/database/postgres/sorted/add.ts index 6f87416089..8556d6d4dd 100644 --- a/src/database/postgres/sorted/add.js +++ b/src/database/postgres/sorted/add.ts @@ -1,9 +1,9 @@ 'use strict'; -module.exports = function (module) { - const helpers = require('../helpers'); - const utils = require('../../../utils'); +import helpers from '../helpers'; +import utils from '../../../utils'; +export default function (module) { module.sortedSetAdd = async function (key, score, value) { if (!key) { return; diff --git a/src/database/postgres/sorted/intersect.js b/src/database/postgres/sorted/intersect.ts similarity index 97% rename from src/database/postgres/sorted/intersect.js rename to src/database/postgres/sorted/intersect.ts index e6cd894f19..5781f9a346 100644 --- a/src/database/postgres/sorted/intersect.js +++ b/src/database/postgres/sorted/intersect.ts @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { module.sortedSetIntersectCard = async function (keys) { if (!Array.isArray(keys) || !keys.length) { return 0; @@ -50,7 +50,7 @@ SELECT COUNT(*) c weights.push(1); } - let limit = stop - start + 1; + let limit: any = stop - start + 1; if (limit <= 0) { limit = null; } diff --git a/src/database/postgres/sorted/remove.js b/src/database/postgres/sorted/remove.ts similarity index 95% rename from src/database/postgres/sorted/remove.js rename to src/database/postgres/sorted/remove.ts index 2b90dd8bc2..c808477b2b 100644 --- a/src/database/postgres/sorted/remove.js +++ b/src/database/postgres/sorted/remove.ts @@ -1,7 +1,8 @@ 'use strict'; +import helpers from '../helpers'; -module.exports = function (module) { - const helpers = require('../helpers'); + +export default function (module) { module.sortedSetRemove = async function (key, value) { if (!key) { diff --git a/src/database/postgres/sorted/union.js b/src/database/postgres/sorted/union.ts similarity index 96% rename from src/database/postgres/sorted/union.js rename to src/database/postgres/sorted/union.ts index a8fcbd0d0d..6590f23d8d 100644 --- a/src/database/postgres/sorted/union.js +++ b/src/database/postgres/sorted/union.ts @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { module.sortedSetUnionCard = async function (keys) { if (!Array.isArray(keys) || !keys.length) { return 0; @@ -44,7 +44,7 @@ SELECT COUNT(DISTINCT z."value") c weights.push(1); } - let limit = stop - start + 1; + let limit: any = stop - start + 1; if (limit <= 0) { limit = null; } diff --git a/src/database/postgres/transaction.ts b/src/database/postgres/transaction.ts index 6b255a32bf..483c25828f 100644 --- a/src/database/postgres/transaction.ts +++ b/src/database/postgres/transaction.ts @@ -1,13 +1,13 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { module.transaction = async function (perform, txClient) { let res; if (txClient) { await txClient.query(`SAVEPOINT nodebb_subtx`); try { res = await perform(txClient); - } catch (err) { + } catch (err: any) { await txClient.query(`ROLLBACK TO SAVEPOINT nodebb_subtx`); throw err; } @@ -21,7 +21,7 @@ module.exports = function (module) { await client.query('BEGIN'); res = await perform(client); await client.query('COMMIT'); - } catch (err) { + } catch (err: any) { await client.query('ROLLBACK'); throw err; } finally { diff --git a/src/database/redis.ts b/src/database/redis.ts index 14059f4a8c..0e05522ed1 100644 --- a/src/database/redis.ts +++ b/src/database/redis.ts @@ -1,12 +1,23 @@ 'use strict'; -const nconf = require('nconf'); -const semver = require('semver'); -const session = require('express-session'); +import nconf from 'nconf'; +import semver from 'semver'; +import session from 'express-session'; +import connection from './redis/connection'; +import main from './redis/main'; +import hash from './redis/hash'; +import sets from './redis/sets'; +import sorted from './redis/sets'; +import list from './redis/list'; +import transaction from './redis/transaction'; +import meta from '../meta'; +import redisAdapter from '@socket.io/redis-adapter'; +import connectRedis from 'connect-redis'; -const connection = require('./redis/connection'); -const redisModule = module.exports; + + +const redisModule = {} as any; redisModule.questions = [ { @@ -39,8 +50,7 @@ redisModule.init = async function () { }; redisModule.createSessionStore = async function (options) { - const meta = require('../meta'); - const sessionStore = require('connect-redis')(session); + const sessionStore = connectRedis(session as any); const client = await connection.connect(options); const store = new sessionStore({ client: client, @@ -72,7 +82,7 @@ redisModule.info = async function (cxn) { redisModule.client = redisModule.client || cxn; const data = await cxn.info(); const lines = data.toString().split('\r\n').sort(); - const redisData = {}; + const redisData = {} as any; lines.forEach((line) => { const parts = line.split(':'); if (parts[1]) { @@ -101,19 +111,21 @@ redisModule.info = async function (cxn) { }; redisModule.socketAdapter = async function () { - const redisAdapter = require('@socket.io/redis-adapter'); const pub = await connection.connect(nconf.get('redis')); const sub = await connection.connect(nconf.get('redis')); + //@ts-ignore return redisAdapter(pub, sub, { key: `db:${nconf.get('redis:database')}:adapter_key`, }); }; -require('./redis/main')(redisModule); -require('./redis/hash')(redisModule); -require('./redis/sets')(redisModule); -require('./redis/sorted')(redisModule); -require('./redis/list')(redisModule); -require('./redis/transaction')(redisModule); +main(redisModule); +hash(redisModule); +sets(redisModule); +sorted(redisModule); +list(redisModule); +transaction(redisModule); -require('../promisify')(redisModule, ['client', 'sessionStore']); +import promisify from '../promisify'; +promisify(redisModule, ['client', 'sessionStore']); +export default redisModule; \ No newline at end of file diff --git a/src/database/redis/connection.ts b/src/database/redis/connection.ts index a4ba757ef6..c560389bc5 100644 --- a/src/database/redis/connection.ts +++ b/src/database/redis/connection.ts @@ -1,10 +1,10 @@ 'use strict'; -const nconf = require('nconf'); -const Redis = require('ioredis'); -const winston = require('winston'); +import nconf from 'nconf'; +import Redis from 'ioredis'; +import winston from 'winston'; -const connection = module.exports; +const connection = {} as any; connection.connect = async function (options) { return new Promise((resolve, reject) => { @@ -59,4 +59,6 @@ connection.connect = async function (options) { }); }; -require('../../promisify')(connection); +import promisify from '../../promisify'; +promisify(connection); +export default connection; diff --git a/src/database/redis/hash.ts b/src/database/redis/hash.ts index 45e80cf532..c00ff0e291 100644 --- a/src/database/redis/hash.ts +++ b/src/database/redis/hash.ts @@ -1,11 +1,11 @@ 'use strict'; +import helpers from './helpers'; +import * as cache from '../cache'; -module.exports = function (module) { - const helpers = require('./helpers'); +export default function (module) { + const cacheCreate = cache.create('redis'); - const cache = require('../cache').create('redis'); - - module.objectCache = cache; + module.objectCache = cacheCreate; module.setObject = async function (key, data) { if (!key || !data) { @@ -33,7 +33,7 @@ module.exports = function (module) { await module.client.hmset(key, data); } - cache.del(key); + cacheCreate.del(key); }; module.setObjectBulk = async function (...args) { @@ -54,7 +54,7 @@ module.exports = function (module) { } }); await helpers.execBatch(batch); - cache.del(data.map(item => item[0])); + cacheCreate.del(data.map(item => item[0])); }; module.setObjectField = async function (key, field, value) { @@ -69,7 +69,7 @@ module.exports = function (module) { await module.client.hset(key, field, value); } - cache.del(key); + cacheCreate.del(key); }; module.getObject = async function (key, fields = []) { @@ -90,7 +90,7 @@ module.exports = function (module) { return null; } const cachedData = {}; - cache.getUnCachedKeys([key], cachedData); + cacheCreate.getUnCachedKeys([key], cachedData); if (cachedData[key]) { return cachedData[key].hasOwnProperty(field) ? cachedData[key][field] : null; } @@ -111,9 +111,9 @@ module.exports = function (module) { } const cachedData = {}; - const unCachedKeys = cache.getUnCachedKeys(keys, cachedData); + const unCachedKeys = cacheCreate.getUnCachedKeys(keys, cachedData); - let data = []; + let data = [] as any[]; if (unCachedKeys.length > 1) { const batch = module.client.batch(); unCachedKeys.forEach(k => batch.hgetall(k)); @@ -132,7 +132,7 @@ module.exports = function (module) { unCachedKeys.forEach((key, i) => { cachedData[key] = data[i] || null; - cache.set(key, cachedData[key]); + cacheCreate.set(key, cachedData[key]); }); if (!Array.isArray(fields) || !fields.length) { @@ -173,7 +173,7 @@ module.exports = function (module) { return; } await module.client.hdel(key, field); - cache.del(key); + cacheCreate.del(key); }; module.deleteObjectFields = async function (key, fields) { @@ -192,7 +192,7 @@ module.exports = function (module) { await module.client.hdel(key, fields); } - cache.del(key); + cacheCreate.del(key); }; module.incrObjectField = async function (key, field) { @@ -216,7 +216,7 @@ module.exports = function (module) { } else { result = await module.client.hincrby(key, field, value); } - cache.del(key); + cacheCreate.del(key); return Array.isArray(result) ? result.map(value => parseInt(value, 10)) : parseInt(result, 10); }; @@ -232,6 +232,6 @@ module.exports = function (module) { } }); await helpers.execBatch(batch); - cache.del(data.map(item => item[0])); + cacheCreate.del(data.map(item => item[0])); }; }; diff --git a/src/database/redis/helpers.ts b/src/database/redis/helpers.ts index 8961da8255..41e3dbff5b 100644 --- a/src/database/redis/helpers.ts +++ b/src/database/redis/helpers.ts @@ -1,6 +1,6 @@ 'use strict'; -const helpers = module.exports; +const helpers = {} as any; helpers.noop = function () {}; @@ -28,3 +28,5 @@ helpers.zsetToObjectArray = function (data) { } return objects; }; + +export default helpers; \ No newline at end of file diff --git a/src/database/redis/list.ts b/src/database/redis/list.ts index 101ef178e3..3fde2be4eb 100644 --- a/src/database/redis/list.ts +++ b/src/database/redis/list.ts @@ -1,7 +1,8 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); + +export default function (module) { module.listPrepend = async function (key, value) { if (!key) { diff --git a/src/database/redis/main.ts b/src/database/redis/main.ts index fcb12844a8..52ca5f1338 100644 --- a/src/database/redis/main.ts +++ b/src/database/redis/main.ts @@ -1,7 +1,8 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); + +export default function (module) { module.flushdb = async function () { await module.client.send_command('flushdb', []); @@ -71,7 +72,7 @@ module.exports = function (module) { module.rename = async function (oldKey, newKey) { try { await module.client.rename(oldKey, newKey); - } catch (err) { + } catch (err: any) { if (err && err.message !== 'ERR no such key') { throw err; } diff --git a/src/database/redis/pubsub.ts b/src/database/redis/pubsub.ts index a7d220682d..f03673742e 100644 --- a/src/database/redis/pubsub.ts +++ b/src/database/redis/pubsub.ts @@ -1,10 +1,10 @@ 'use strict'; -const nconf = require('nconf'); -const util = require('util'); -const winston = require('winston'); -const { EventEmitter } = require('events'); -const connection = require('./connection'); +import nconf from 'nconf'; +import util from 'util'; +import winston from 'winston'; +import { EventEmitter } from 'events'; +import connection from './connection'; let channelName; const PubSub = function () { @@ -22,7 +22,7 @@ const PubSub = function () { try { const msg = JSON.parse(message); self.emit(msg.event, msg.data); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }); @@ -46,4 +46,4 @@ PubSub.prototype.publish = function (event, data) { } }; -module.exports = new PubSub(); +export default new PubSub(); diff --git a/src/database/redis/sets.ts b/src/database/redis/sets.ts index b2b390598b..ed45bc63c2 100644 --- a/src/database/redis/sets.ts +++ b/src/database/redis/sets.ts @@ -1,7 +1,7 @@ 'use strict'; +import helpers from './helpers'; -module.exports = function (module) { - const helpers = require('./helpers'); +export default function (module) { module.setAdd = async function (key, value) { if (!Array.isArray(value)) { diff --git a/src/database/redis/sorted.ts b/src/database/redis/sorted.ts index bef347677b..c941747ebb 100644 --- a/src/database/redis/sorted.ts +++ b/src/database/redis/sorted.ts @@ -1,14 +1,19 @@ 'use strict'; -module.exports = function (module) { - const utils = require('../../utils'); - const helpers = require('./helpers'); - const dbHelpers = require('../helpers'); +import utils from '../../utils'; +import helpers from './helpers'; +import dbHelpers from '../helpers'; - require('./sorted/add')(module); - require('./sorted/remove')(module); - require('./sorted/union')(module); - require('./sorted/intersect')(module); +import add from './sorted/add'; +import remove from './sorted/remove'; +import sorted from './sorted/union'; +import intersect from './sorted/intersect'; + +export default function (module) { + add(module); + remove(module); + sorted(module); + intersect(module); module.getSortedSetRange = async function (key, start, stop) { return await sortedSetRange('zrange', key, start, stop, '-inf', '+inf', false); @@ -265,7 +270,7 @@ module.exports = function (module) { return await sortedSetLex('zlexcount', false, key, min, max); }; - async function sortedSetLex(method, reverse, key, min, max, start, count) { + async function sortedSetLex(method, reverse, key, min, max, start?, count?) { let minmin; let maxmax; if (reverse) { @@ -292,7 +297,7 @@ module.exports = function (module) { module.getSortedSetScan = async function (params) { let cursor = '0'; - const returnData = []; + const returnData = [] as any[]; let done = false; const seen = {}; do { diff --git a/src/database/redis/sorted/add.js b/src/database/redis/sorted/add.ts similarity index 94% rename from src/database/redis/sorted/add.js rename to src/database/redis/sorted/add.ts index 660618b8a4..e7c86cf05b 100644 --- a/src/database/redis/sorted/add.js +++ b/src/database/redis/sorted/add.ts @@ -1,9 +1,8 @@ 'use strict'; +import helpers from '../helpers'; +import utils from '../../../utils'; -module.exports = function (module) { - const helpers = require('../helpers'); - const utils = require('../../../utils'); - +export default function (module) { module.sortedSetAdd = async function (key, score, value) { if (!key) { return; diff --git a/src/database/redis/sorted/intersect.js b/src/database/redis/sorted/intersect.ts similarity index 95% rename from src/database/redis/sorted/intersect.js rename to src/database/redis/sorted/intersect.ts index 2b2ed1fe90..6b50e41ac5 100644 --- a/src/database/redis/sorted/intersect.js +++ b/src/database/redis/sorted/intersect.ts @@ -1,8 +1,9 @@ 'use strict'; +import helpers from '../helpers'; -module.exports = function (module) { - const helpers = require('../helpers'); + +export default function (module) { module.sortedSetIntersectCard = async function (keys) { if (!Array.isArray(keys) || !keys.length) { return 0; diff --git a/src/database/redis/sorted/remove.js b/src/database/redis/sorted/remove.ts similarity index 93% rename from src/database/redis/sorted/remove.js rename to src/database/redis/sorted/remove.ts index 0c2b0164b0..032a759b5b 100644 --- a/src/database/redis/sorted/remove.js +++ b/src/database/redis/sorted/remove.ts @@ -1,9 +1,9 @@ 'use strict'; +import helpers from '../helpers'; -module.exports = function (module) { - const helpers = require('../helpers'); +export default function (module) { module.sortedSetRemove = async function (key, value) { if (!key) { return; diff --git a/src/database/redis/sorted/union.js b/src/database/redis/sorted/union.ts similarity index 94% rename from src/database/redis/sorted/union.js rename to src/database/redis/sorted/union.ts index acd57c2db0..be104e8115 100644 --- a/src/database/redis/sorted/union.js +++ b/src/database/redis/sorted/union.ts @@ -1,8 +1,9 @@ 'use strict'; +import helpers from '../helpers'; -module.exports = function (module) { - const helpers = require('../helpers'); + +export default function (module) { module.sortedSetUnionCard = async function (keys) { const tempSetName = `temp_${Date.now()}`; if (!keys.length) { diff --git a/src/database/redis/transaction.ts b/src/database/redis/transaction.ts index f914a2dfca..38dcdc6513 100644 --- a/src/database/redis/transaction.ts +++ b/src/database/redis/transaction.ts @@ -1,6 +1,6 @@ 'use strict'; -module.exports = function (module) { +export default function (module) { // TODO module.transaction = function (perform, callback) { perform(module.client, callback); diff --git a/src/emailer.ts b/src/emailer.ts index 486729eaae..9ffa47bf0b 100644 --- a/src/emailer.ts +++ b/src/emailer.ts @@ -1,26 +1,27 @@ 'use strict'; -const winston = require('winston'); -const nconf = require('nconf'); -const Benchpress = require('benchpressjs'); -const nodemailer = require('nodemailer'); -const wellKnownServices = require('nodemailer/lib/well-known/services'); -const { htmlToText } = require('html-to-text'); -const url = require('url'); -const path = require('path'); -const fs = require('fs'); -const _ = require('lodash'); -const jwt = require('jsonwebtoken'); +import winston from 'winston'; +import nconf from 'nconf'; +import Benchpress from 'benchpressjs'; +import nodemailer from 'nodemailer'; +// @ts-ignore +import wellKnownServices from 'nodemailer/lib/well-known/services'; +import { htmlToText } from 'html-to-text'; +import url from 'url'; +import path from 'path'; +import fs from 'fs'; +import _ from 'lodash'; +import jwt from 'jsonwebtoken'; -const User = require('./user'); -const Plugins = require('./plugins'); -const meta = require('./meta'); -const translator = require('./translator'); -const pubsub = require('./pubsub'); -const file = require('./file'); +import User from './user'; +import Plugins from './plugins'; +import meta from './meta'; +import translator from './translator'; +import pubsub from './pubsub'; +import file from './file'; const viewsDir = nconf.get('views_dir'); -const Emailer = module.exports; +const Emailer = {} as any; let prevConfig; let app; @@ -90,7 +91,7 @@ const buildCustomTemplates = async (config) => { Benchpress.flush(); winston.verbose('[emailer] Built custom email templates'); - } catch (err) { + } catch (err: any) { winston.error(`[emailer] Failed to build custom email templates\n${err.stack}`); } }; @@ -122,7 +123,7 @@ Emailer.setupFallbackTransport = (config) => { const smtpOptions = { name: getHostname(), pool: config['email:smtpTransport:pool'], - }; + } as any; if (config['email:smtpTransport:user'] || config['email:smtpTransport:pass']) { smtpOptions.auth = { @@ -235,7 +236,7 @@ Emailer.send = async (template, uid, params) => { } if (!userData || !userData.email) { - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { winston.warn(`uid : ${uid} has no email, not sending "${template}" email.`); } return; @@ -243,7 +244,7 @@ Emailer.send = async (template, uid, params) => { const allowedTpls = ['verify-email', 'welcome', 'registration_accepted', 'reset', 'reset_notify']; if (!meta.config.includeUnverifiedEmails && !userData['email:confirmed'] && !allowedTpls.includes(template)) { - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { winston.warn(`uid : ${uid} (${userData.email}) has not confirmed email, not sending "${template}" email.`); } return; @@ -275,7 +276,7 @@ Emailer.sendToEmail = async (template, email, language, params) => { let payload = { template: template, uid: params.uid, - }; + } as any; if (unsubscribable.includes(template)) { if (template === 'notification') { @@ -339,7 +340,7 @@ Emailer.sendToEmail = async (template, email, language, params) => { } else { await Emailer.sendViaFallback(data); } - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT' && usingFallback) { Emailer.fallbackNotFound = true; throw new Error('[[error:sendmail-not-found]]'); @@ -365,4 +366,7 @@ Emailer.renderAndTranslate = async (template, params, lang) => { return await translator.translate(html, lang); }; -require('./promisify')(Emailer, ['transports']); +import promisify from './promisify'; +promisify(Emailer, ['transports']); + +export default Emailer; \ No newline at end of file diff --git a/src/events.ts b/src/events.ts index 637f53acf6..68726d10e8 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,16 +1,17 @@ 'use strict'; -const validator = require('validator'); -const _ = require('lodash'); +import validator from 'validator'; +import _ from 'lodash'; -const db = require('./database'); -const batch = require('./batch'); -const user = require('./user'); -const utils = require('./utils'); -const plugins = require('./plugins'); +import db from './database'; -const events = module.exports; +import * as batch from './batch'; +import user from './user'; +import utils from './utils'; +import plugins from './plugins'; + +const events = {} as any; events.types = [ 'plugin-activate', @@ -171,4 +172,7 @@ events.deleteAll = async function () { }, { alwaysStartAt: 0, batch: 500 }); }; -require('./promisify')(events); +import promisify from './promisify'; +promisify(events); + +export default events; diff --git a/src/file.ts b/src/file.ts index ff836b05da..16e0c702c2 100644 --- a/src/file.ts +++ b/src/file.ts @@ -1,18 +1,19 @@ 'use strict'; -const fs = require('fs'); -const nconf = require('nconf'); -const path = require('path'); -const winston = require('winston'); -const mkdirp = require('mkdirp'); -const mime = require('mime'); -const graceful = require('graceful-fs'); - -const slugify = require('./slugify'); +import fs from 'fs'; +import nconf from 'nconf'; +import path from 'path'; +import winston from 'winston'; +import mkdirp from 'mkdirp'; +import mime from 'mime'; +import graceful from 'graceful-fs'; +import slugify from './slugify'; +import meta from './meta'; +import promisify from './promisify'; graceful.gracefulify(fs); -const file = module.exports; +const file = {} as any; file.saveFileToLocal = async function (filename, folder, tempPath) { /* @@ -54,7 +55,6 @@ file.appendToFileName = function (filename, string) { }; file.allowedExtensions = function () { - const meta = require('./meta'); let allowedExtensions = (meta.config.allowedFileExtensions || '').trim(); if (!allowedExtensions) { return []; @@ -78,7 +78,7 @@ file.allowedExtensions = function () { file.exists = async function (path) { try { await fs.promises.stat(path); - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return false; } @@ -90,7 +90,7 @@ file.exists = async function (path) { file.existsSync = function (path) { try { fs.statSync(path); - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return false; } @@ -106,7 +106,7 @@ file.delete = async function (path) { } try { await fs.promises.unlink(path); - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { winston.verbose(`[file] Attempted to delete non-existent file: ${path}`); return; @@ -117,11 +117,11 @@ file.delete = async function (path) { }; file.link = async function link(filePath, destPath, relative) { - if (relative && process.platform !== 'win32') { + if (relative && (process as any).platform !== 'win32') { filePath = path.relative(path.dirname(destPath), filePath); } - if (process.platform === 'win32') { + if ((process as any).platform === 'win32') { await fs.promises.link(filePath, destPath); } else { await fs.promises.symlink(filePath, destPath, 'file'); @@ -129,11 +129,11 @@ file.link = async function link(filePath, destPath, relative) { }; file.linkDirs = async function linkDirs(sourceDir, destDir, relative) { - if (relative && process.platform !== 'win32') { + if (relative && (process as any).platform !== 'win32') { sourceDir = path.relative(path.dirname(destDir), sourceDir); } - const type = (process.platform === 'win32') ? 'junction' : 'dir'; + const type = ((process as any).platform === 'win32') ? 'junction' : 'dir'; await fs.promises.symlink(sourceDir, destDir, type); }; @@ -155,4 +155,5 @@ file.walk = async function (dir) { return files.reduce((a, f) => a.concat(f), []); }; -require('./promisify')(file); +promisify(file); +export default file; \ No newline at end of file diff --git a/src/flags.ts b/src/flags.ts index 8a400c9d88..64adf5e554 100644 --- a/src/flags.ts +++ b/src/flags.ts @@ -1,24 +1,25 @@ 'use strict'; -const _ = require('lodash'); -const winston = require('winston'); -const validator = require('validator'); +import _ from 'lodash'; +import winston from 'winston'; +import validator from 'validator'; -const db = require('./database'); -const user = require('./user'); -const groups = require('./groups'); -const meta = require('./meta'); -const notifications = require('./notifications'); -const analytics = require('./analytics'); -const categories = require('./categories'); -const topics = require('./topics'); -const posts = require('./posts'); -const privileges = require('./privileges'); -const plugins = require('./plugins'); -const utils = require('./utils'); -const batch = require('./batch'); +import db from './database'; -const Flags = module.exports; +import user from './user'; +import groups from './groups'; +import meta from './meta'; +import notifications from './notifications'; +import analytics from './analytics'; +import categories from './categories'; +import topics from './topics'; +import posts from './posts'; +import privileges from './privileges'; +import plugins from './plugins'; +import utils from './utils'; +import * as batch from './batch'; + +const Flags = {} as any; Flags._states = new Map([ ['open', { @@ -96,7 +97,7 @@ Flags.init = async function () { try { ({ filters: Flags._filters } = await plugins.hooks.fire('filter:flags.getFilters', hookData)); ({ filters: Flags._filters, states: Flags._states } = await plugins.hooks.fire('filter:flags.init', hookData)); - } catch (err) { + } catch (err: any) { winston.error(`[flags/init] Could not retrieve filters\n${err.stack}`); Flags._filters = {}; } @@ -548,6 +549,7 @@ Flags.addReport = async function (flagId, type, id, uid, reason, timestamp) { ['flags:hash', flagId, [type, id, uid].join(':')], ]); + plugins.hooks.fire('action:flags.addReport', { flagId, type, id, uid, reason, timestamp }); }; @@ -793,8 +795,9 @@ Flags.appendNote = async function (flagId, uid, note, datetime) { if (datetime) { try { await Flags.deleteNote(flagId, datetime); - } catch (e) { + } catch (e: any) { // Do not throw if note doesn't exist + // @ts-ignore if (!e.message === '[[error:invalid-data]]') { throw e; } @@ -953,4 +956,6 @@ async function mergeUsernameEmailChanges(history, targetUid, uids) { }, [])); } -require('./promisify')(Flags); +import promisify from './promisify'; +promisify(Flags); +export default Flags; \ No newline at end of file diff --git a/src/groups/cache.ts b/src/groups/cache.ts index ede405dcee..37a73b22bc 100644 --- a/src/groups/cache.ts +++ b/src/groups/cache.ts @@ -1,8 +1,8 @@ 'use strict'; -const cacheCreate = require('../cache/lru'); +import cacheCreate from '../cache/lru'; -module.exports = function (Groups) { +export default function (Groups) { Groups.cache = cacheCreate({ name: 'group', max: 40000, diff --git a/src/groups/cover.ts b/src/groups/cover.ts index a643126ecb..887a5fb2db 100644 --- a/src/groups/cover.ts +++ b/src/groups/cover.ts @@ -1,14 +1,12 @@ 'use strict'; -const path = require('path'); +import path from 'path'; +import nconf from 'nconf'; +import db from '../database'; +import image from '../image'; +import file from '../file'; -const nconf = require('nconf'); - -const db = require('../database'); -const image = require('../image'); -const file = require('../file'); - -module.exports = function (Groups) { +export default function (Groups) { const allowedTypes = ['image/png', 'image/jpeg', 'image/bmp']; Groups.updateCoverPosition = async function (groupName, position) { if (!groupName) { diff --git a/src/groups/create.ts b/src/groups/create.ts index 74ef56a41f..b196429eb1 100644 --- a/src/groups/create.ts +++ b/src/groups/create.ts @@ -1,11 +1,11 @@ 'use strict'; -const meta = require('../meta'); -const plugins = require('../plugins'); -const slugify = require('../slugify'); -const db = require('../database'); +import meta from '../meta'; +import plugins from '../plugins'; +import slugify from '../slugify'; +import db from '../database'; -module.exports = function (Groups) { +export default function (Groups) { Groups.create = async function (data) { const isSystem = isSystemGroup(data); const timestamp = data.timestamp || Date.now(); diff --git a/src/groups/data.ts b/src/groups/data.ts index 5ecb9081e0..eaf82872fd 100644 --- a/src/groups/data.ts +++ b/src/groups/data.ts @@ -1,19 +1,19 @@ 'use strict'; -const validator = require('validator'); -const nconf = require('nconf'); - -const db = require('../database'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const translator = require('../translator'); +import validator from 'validator'; +import nconf from 'nconf'; +import db from '../database'; +import plugins from '../plugins'; +import utils from '../utils'; +import translator from '../translator'; +import coverPhoto from '../coverPhoto'; const intFields = [ 'createtime', 'memberCount', 'hidden', 'system', 'private', 'userTitleEnabled', 'disableJoinRequests', 'disableLeave', ]; -module.exports = function (Groups) { +export default function (Groups) { Groups.getGroupsFields = async function (groupNames, fields) { if (!Array.isArray(groupNames) || !groupNames.length) { return []; @@ -84,13 +84,13 @@ function modifyGroup(group, fields) { if (group['cover:url']) { group['cover:url'] = group['cover:url'].startsWith('http') ? group['cover:url'] : (nconf.get('relative_path') + group['cover:url']); } else { - group['cover:url'] = require('../coverPhoto').getDefaultGroupCover(group.name); + group['cover:url'] .getDefaultGroupCover(group.name); } if (group['cover:thumb:url']) { group['cover:thumb:url'] = group['cover:thumb:url'].startsWith('http') ? group['cover:thumb:url'] : (nconf.get('relative_path') + group['cover:thumb:url']); } else { - group['cover:thumb:url'] = require('../coverPhoto').getDefaultGroupCover(group.name); + group['cover:thumb:url'] = coverPhoto.getDefaultGroupCover(group.name); } group['cover:position'] = validator.escape(String(group['cover:position'] || '50% 50%')); diff --git a/src/groups/delete.ts b/src/groups/delete.ts index 1fc8beef02..495408ca0e 100644 --- a/src/groups/delete.ts +++ b/src/groups/delete.ts @@ -1,11 +1,11 @@ 'use strict'; -const plugins = require('../plugins'); -const slugify = require('../slugify'); -const db = require('../database'); -const batch = require('../batch'); +import plugins from '../plugins'; +import slugify from '../slugify'; +import db from '../database'; +import * as batch from '../batch'; -module.exports = function (Groups) { +export default function (Groups) { Groups.destroy = async function (groupNames) { if (!Array.isArray(groupNames)) { groupNames = [groupNames]; diff --git a/src/groups/index.ts b/src/groups/index.ts index 5f1904f632..7341dde8c8 100644 --- a/src/groups/index.ts +++ b/src/groups/index.ts @@ -1,26 +1,42 @@ 'use strict'; -const user = require('../user'); -const db = require('../database'); -const plugins = require('../plugins'); -const slugify = require('../slugify'); +import user from '../user'; +import db from '../database'; +import plugins from '../plugins'; +import slugify from '../slugify'; -const Groups = module.exports; +const Groups = {} as any; -require('./data')(Groups); -require('./create')(Groups); -require('./delete')(Groups); -require('./update')(Groups); -require('./invite')(Groups); -require('./membership')(Groups); -require('./ownership')(Groups); -require('./search')(Groups); -require('./cover')(Groups); -require('./posts')(Groups); -require('./user')(Groups); -require('./join')(Groups); -require('./leave')(Groups); -require('./cache')(Groups); +import data from './data'; +import create from './create'; +import deleteGroup from './delete'; +import update from './update'; +import invite from './invite'; +import membership from './membership'; +import ownership from './ownership'; +import search from './search'; +import conver from './cover'; +import posts from './posts'; +import cover from './cover'; +import userFn from './user'; +import join from './join'; +import leave from './leave'; +import cache from './cache'; + +data(Groups); +create(Groups); +deleteGroup(Groups); +update(Groups); +invite(Groups); +membership(Groups); +ownership(Groups); +search(Groups); +cover(Groups); +posts(Groups); +userFn(Groups); +join(Groups); +leave(Groups); +cache(Groups); Groups.BANNED_USERS = 'banned-users'; @@ -244,4 +260,6 @@ Groups.existsBySlug = async function (slug) { return await db.isObjectField('groupslug:groupname', slug); }; -require('../promisify')(Groups); +import promisify from '../promisify'; +promisify(Groups); +export default Groups; \ No newline at end of file diff --git a/src/groups/invite.ts b/src/groups/invite.ts index 5cabdbdcdf..c10cc40188 100644 --- a/src/groups/invite.ts +++ b/src/groups/invite.ts @@ -1,14 +1,13 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import user from '../user'; +import slugify from '../slugify'; +import plugins from '../plugins'; +import notifications from '../notifications'; -const db = require('../database'); -const user = require('../user'); -const slugify = require('../slugify'); -const plugins = require('../plugins'); -const notifications = require('../notifications'); - -module.exports = function (Groups) { +export default function (Groups) { Groups.requestMembership = async function (groupName, uid) { await inviteOrRequestMembership(groupName, uid, 'request'); const { displayname } = await user.getUserFields(uid, ['username']); @@ -45,7 +44,7 @@ module.exports = function (Groups) { if (!Array.isArray(groupNames)) { groupNames = [groupNames]; } - const sets = []; + const sets = [] as any[]; groupNames.forEach(groupName => sets.push(`group:${groupName}:pending`, `group:${groupName}:invited`)); await db.setsRemove(sets, uid); }; diff --git a/src/groups/join.ts b/src/groups/join.ts index 9fb02ec0bb..ea8635a2b7 100644 --- a/src/groups/join.ts +++ b/src/groups/join.ts @@ -1,13 +1,12 @@ 'use strict'; -const winston = require('winston'); +import winston from 'winston'; +import db from '../database'; +import user from '../user'; +import plugins from '../plugins'; +import cache from '../cache'; -const db = require('../database'); -const user = require('../user'); -const plugins = require('../plugins'); -const cache = require('../cache'); - -module.exports = function (Groups) { +export default function (Groups) { Groups.join = async function (groupNames, uid) { if (!groupNames) { throw new Error('[[error:invalid-data]]'); @@ -81,7 +80,7 @@ module.exports = function (Groups) { name: groupName, hidden: 1, }); - } catch (err) { + } catch (err: any) { if (err && err.message !== '[[error:group-already-exists]]') { winston.error(`[groups.join] Could not create new hidden group (${groupName})\n${err.stack}`); throw err; diff --git a/src/groups/leave.ts b/src/groups/leave.ts index 14bfb2558c..b10542f6f5 100644 --- a/src/groups/leave.ts +++ b/src/groups/leave.ts @@ -1,11 +1,11 @@ 'use strict'; -const db = require('../database'); -const user = require('../user'); -const plugins = require('../plugins'); -const cache = require('../cache'); +import db from '../database'; +import user from '../user'; +import plugins from '../plugins'; +import cache from '../cache'; -module.exports = function (Groups) { +export default function (Groups) { Groups.leave = async function (groupNames, uid) { if (Array.isArray(groupNames) && !groupNames.length) { return; @@ -38,7 +38,7 @@ module.exports = function (Groups) { const emptyPrivilegeGroups = groupData.filter(g => g && Groups.isPrivilegeGroup(g.name) && g.memberCount === 0); const visibleGroups = groupData.filter(g => g && !g.hidden); - const promises = []; + const promises = [] as any[]; if (emptyPrivilegeGroups.length) { promises.push(Groups.destroy, emptyPrivilegeGroups); } diff --git a/src/groups/membership.ts b/src/groups/membership.ts index f37853d433..68d292dfcc 100644 --- a/src/groups/membership.ts +++ b/src/groups/membership.ts @@ -1,12 +1,11 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import user from '../user'; +import cache from '../cache'; -const db = require('../database'); -const user = require('../user'); -const cache = require('../cache'); - -module.exports = function (Groups) { +export default function (Groups) { Groups.getMembers = async function (groupName, start, stop) { return await db.getSortedSetRevRange(`group:${groupName}:members`, start, stop); }; diff --git a/src/groups/ownership.ts b/src/groups/ownership.ts index ade58e65c9..34a0e46d58 100644 --- a/src/groups/ownership.ts +++ b/src/groups/ownership.ts @@ -1,9 +1,9 @@ 'use strict'; -const db = require('../database'); -const plugins = require('../plugins'); +import db from '../database'; +import plugins from '../plugins'; -module.exports = function (Groups) { +export default function (Groups) { Groups.ownership = {}; Groups.ownership.isOwner = async function (uid, groupName) { diff --git a/src/groups/posts.ts b/src/groups/posts.ts index 58d6831cfe..8b4cab95d3 100644 --- a/src/groups/posts.ts +++ b/src/groups/posts.ts @@ -1,11 +1,11 @@ 'use strict'; -const db = require('../database'); -const groups = require('.'); -const privileges = require('../privileges'); -const posts = require('../posts'); +import db from '../database'; +import groups from '.'; +import privileges from '../privileges'; +import posts from '../posts'; -module.exports = function (Groups) { +export default function (Groups) { Groups.onNewPostMade = async function (postData) { if (!parseInt(postData.uid, 10)) { return; diff --git a/src/groups/search.ts b/src/groups/search.ts index 9b6b15d5a4..221085af98 100644 --- a/src/groups/search.ts +++ b/src/groups/search.ts @@ -1,9 +1,9 @@ 'use strict'; -const user = require('../user'); -const db = require('../database'); +import user from '../user'; +import db from '../database'; -module.exports = function (Groups) { +export default function (Groups) { Groups.search = async function (query, options) { if (!query) { return []; diff --git a/src/groups/update.ts b/src/groups/update.ts index 56b541df27..a12e262a4b 100644 --- a/src/groups/update.ts +++ b/src/groups/update.ts @@ -1,18 +1,21 @@ 'use strict'; -const winston = require('winston'); - -const categories = require('../categories'); -const plugins = require('../plugins'); -const slugify = require('../slugify'); -const db = require('../database'); -const user = require('../user'); -const batch = require('../batch'); -const meta = require('../meta'); -const cache = require('../cache'); +import winston from 'winston'; +import categories from '../categories'; +import plugins from '../plugins'; +import slugify from '../slugify'; +import db from '../database'; +import user from '../user'; +import * as batch from '../batch'; +import meta from '../meta'; +import cache from '../cache'; +import admin from '../widgets/admin'; +import widgets from '../widgets'; +import navigation from '../navigation/admin'; -module.exports = function (Groups) { + +export default function (Groups) { Groups.update = async function (groupName, values) { const exists = await db.exists(`group:${groupName}`); if (!exists) { @@ -37,7 +40,7 @@ module.exports = function (Groups) { icon: values.icon || '', labelColor: values.labelColor || '#000000', textColor: values.textColor || '#ffffff', - }; + } as any; if (values.hasOwnProperty('userTitle')) { payload.userTitle = values.userTitle || ''; @@ -240,7 +243,6 @@ module.exports = function (Groups) { } async function updateNavigationItems(oldName, newName) { - const navigation = require('../navigation/admin'); const navItems = await navigation.get(); navItems.forEach((navItem) => { if (navItem && Array.isArray(navItem.groups) && navItem.groups.includes(oldName)) { @@ -252,8 +254,7 @@ module.exports = function (Groups) { } async function updateWidgets(oldName, newName) { - const admin = require('../widgets/admin'); - const widgets = require('../widgets'); + const data = await admin.get(); diff --git a/src/groups/user.ts b/src/groups/user.ts index 4238296a37..2db8bf0e20 100644 --- a/src/groups/user.ts +++ b/src/groups/user.ts @@ -1,9 +1,9 @@ 'use strict'; -const db = require('../database'); -const user = require('../user'); +import db from '../database'; +import user from '../user'; -module.exports = function (Groups) { +export default function (Groups) { Groups.getUsersFromSet = async function (set, fields) { const uids = await db.getSetMembers(set); @@ -51,7 +51,7 @@ module.exports = function (Groups) { ]); const ownGroups = privateGroups.filter((group, index) => ownership[index]); - let inviteGroups = []; + let inviteGroups = [] as any[]; if (isAdmin) { inviteGroups = inviteGroups.concat(adminModGroups).concat(privateGroups); } else if (isGlobalMod) { diff --git a/src/helpers.ts b/src/helpers.ts index b75e950c26..15b2fd50d8 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,7 +1,13 @@ 'use strict'; +//@ts-ignore +import commonHelpers from '../../public/src/modules/helpers.common'; +import utils from './utils'; +import benchpressjs from 'benchpressjs'; +import nconf from 'nconf'; -module.exports = require('../public/src/modules/helpers.common')( - require('./utils'), - require('benchpressjs'), - require('nconf').get('relative_path'), +export default commonHelpers( + utils, + benchpressjs, + nconf.get('relative_path'), ); + diff --git a/src/image.ts b/src/image.ts index 2374693aa0..288ceea6ad 100644 --- a/src/image.ts +++ b/src/image.ts @@ -1,19 +1,20 @@ 'use strict'; -const os = require('os'); -const fs = require('fs'); -const path = require('path'); -const crypto = require('crypto'); -const winston = require('winston'); +import os from 'os'; +import fs from 'fs'; +import path from 'path'; +import crypto from 'crypto'; +import winston from 'winston'; -const file = require('./file'); -const plugins = require('./plugins'); -const meta = require('./meta'); +import file from './file'; +import plugins from './plugins'; +import meta from './meta'; +import sharp from 'sharp'; -const image = module.exports; + +const image = {} as any; function requireSharp() { - const sharp = require('sharp'); if (os.platform() === 'win32') { // https://github.com/lovell/sharp/issues/1259 sharp.cache(false); @@ -22,11 +23,9 @@ function requireSharp() { } image.isFileTypeAllowed = async function (path) { - const plugins = require('./plugins'); if (plugins.hooks.hasListeners('filter:image.isFileTypeAllowed')) { return await plugins.hooks.fire('filter:image.isFileTypeAllowed', path); } - const sharp = require('sharp'); await sharp(path, { failOnError: true, }).metadata(); @@ -116,15 +115,13 @@ image.stripEXIF = async function (path) { const buffer = await fs.promises.readFile(path); const sharp = requireSharp(); await sharp(buffer, { failOnError: true }).rotate().toFile(path); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }; image.checkDimensions = async function (path) { - const meta = require('./meta'); const result = await image.size(path); - if (result.width > meta.config.rejectImageWidth || result.height > meta.config.rejectImageHeight) { throw new Error('[[error:invalid-image-dimensions]]'); } @@ -179,4 +176,6 @@ image.uploadImage = async function (filename, folder, imageData) { }; }; -require('./promisify')(image); +import promisify from './promisify'; +promisify(image); +export default image; \ No newline at end of file diff --git a/src/install.ts b/src/install.ts index d1229de531..3be6334022 100644 --- a/src/install.ts +++ b/src/install.ts @@ -1,17 +1,37 @@ 'use strict'; -const fs = require('fs'); -const url = require('url'); -const path = require('path'); -const prompt = require('prompt'); -const winston = require('winston'); -const nconf = require('nconf'); -const _ = require('lodash'); +import fs from 'fs'; +import url from 'url'; +import path from 'path'; +import prompt from 'prompt'; +import winston from 'winston'; +import nconf from 'nconf'; +import _ from 'lodash'; +import upgrade from './upgrade'; +import utils from './utils'; +import redis from './database/redis'; +import mongo from './database/mongo'; +import postgres from './database/postgres'; +import configureDatabases from '../install/databases'; +import db from './database'; +import meta from './meta'; +import groups from './groups'; +import navigation from './navigation'; +import User from './user'; +import Groups from './groups'; +import privileges from './privileges'; +import { defaults, data } from 'autoprefixer'; +import Categories from './categories'; +import file from './file'; +import Topics from './topics'; -const utils = require('./utils'); +const { redisQuestions } = redis; +const { mongoQuestions } = mongo; +const { postgresQuestions } = postgres; -const install = module.exports; -const questions = {}; + +const install = {} as any; +const questions = {} as any; questions.main = [ { @@ -65,14 +85,14 @@ function checkSetupFlagEnv() { }; // Set setup values from env vars (if set) - const envKeys = Object.keys(process.env); + const envKeys = Object.keys((process as any).env); if (Object.keys(envConfMap).some(key => envKeys.includes(key))) { winston.info('[install/checkSetupFlagEnv] checking env vars for setup info...'); setupVal = setupVal || {}; - Object.entries(process.env).forEach(([evName, evValue]) => { // get setup values from env + Object.entries((process as any).env).forEach(([evName, evValue]) => { // get setup values from env if (evName.startsWith('NODEBB_DB_')) { - setupVal[`${process.env.NODEBB_DB}:${envConfMap[evName]}`] = evValue; + setupVal[`${(process as any).env.NODEBB_DB}:${envConfMap[evName]}`] = evValue; } else if (evName.startsWith('NODEBB_')) { setupVal[envConfMap[evName]] = evValue; } @@ -89,7 +109,7 @@ function checkSetupFlagEnv() { const setupJSON = JSON.parse(nconf.get('setup')); setupVal = { ...setupVal, ...setupJSON }; } - } catch (err) { + } catch (err: any) { winston.error('[install/checkSetupFlagEnv] invalid json in nconf.get(\'setup\'), ignoring setup values from json'); } @@ -111,7 +131,7 @@ function checkSetupFlagEnv() { winston.error(' admin:email'); } - process.exit(); + (process as any).exit(); } } else if (nconf.get('database')) { install.values = install.values || {}; @@ -123,8 +143,7 @@ function checkCIFlag() { let ciVals; try { ciVals = JSON.parse(nconf.get('ci')); - } catch (e) { - ciVals = undefined; +} catch (e: any) { ciVals = undefined; } if (ciVals && ciVals instanceof Object) { @@ -142,13 +161,12 @@ function checkCIFlag() { winston.error(' database'); } - process.exit(); + (process as any).exit(); } } } async function setupConfig() { - const configureDatabases = require('../install/databases'); // prompt prepends "prompt: " to questions, let's clear that. prompt.start(); @@ -159,9 +177,7 @@ async function setupConfig() { if (install.values) { // Use provided values, fall back to defaults - const redisQuestions = require('./database/redis').questions; - const mongoQuestions = require('./database/mongo').questions; - const postgresQuestions = require('./database/postgres').questions; + const allQuestions = [ ...questions.main, ...questions.optional, @@ -197,7 +213,7 @@ async function completeConfigSetup(config) { config.package_manager = nconf.get('package_manager'); } nconf.overrides(config); - const db = require('./database'); + await db.init(); if (db.hasOwnProperty('createIndices')) { await db.createIndices(); @@ -219,13 +235,11 @@ async function completeConfigSetup(config) { urlObj.path = ''; urlObj.pathname = ''; } - config.url = url.format(urlObj); // ref: https://github.com/indexzero/nconf/issues/300 delete config.type; - const meta = require('./meta'); await meta.configs.set('submitPluginUsage', config.submitPluginUsage === 'yes' ? 1 : 0); delete config.submitPluginUsage; @@ -234,16 +248,13 @@ async function completeConfigSetup(config) { async function setupDefaultConfigs() { console.log('Populating database with default configs, if not already set...'); - const meta = require('./meta'); - const defaults = require(path.join(__dirname, '../', 'install/data/defaults.json')); + path.join(__dirname, '../', 'install/data/defaults.json'); await meta.configs.setOnEmpty(defaults); await meta.configs.init(); } async function enableDefaultTheme() { - const meta = require('./meta'); - const id = await meta.configs.get('theme:id'); if (id) { console.log('Previous theme detected, skipping enabling default theme'); @@ -259,7 +270,6 @@ async function enableDefaultTheme() { } async function createDefaultUserGroups() { - const groups = require('./groups'); async function createGroup(name) { await groups.create({ name: name, @@ -288,7 +298,6 @@ async function createDefaultUserGroups() { } async function createAdministrator() { - const Groups = require('./groups'); const memberCount = await Groups.getMemberCount('administrators'); if (memberCount > 0) { console.log('Administrator found, skipping Admin setup'); @@ -298,8 +307,6 @@ async function createAdministrator() { } async function createAdmin() { - const User = require('./user'); - const Groups = require('./groups'); let password; winston.warn('No administrators have been detected, running initial user setup\n'); @@ -341,10 +348,10 @@ async function createAdmin() { try { User.isPasswordValid(results.password); - } catch (err) { + } catch (err: any) { const [namespace, key] = err.message.slice(2, -2).split(':', 2); if (namespace && key && err.message.startsWith('[[') && err.message.endsWith(']]')) { - const lang = require(path.join(__dirname, `../public/language/en-GB/${namespace}`)); + const lang = path.join(__dirname, `../public/language/en-GB/${namespace}`); if (lang && lang[key]) { err.message = lang[key]; } @@ -403,7 +410,6 @@ async function createAdmin() { } async function createGlobalModeratorsGroup() { - const groups = require('./groups'); const exists = await groups.exists('Global Moderators'); if (exists) { winston.info('Global Moderators group found, skipping creation!'); @@ -421,7 +427,6 @@ async function createGlobalModeratorsGroup() { } async function giveGlobalPrivileges() { - const privileges = require('./privileges'); const defaultPrivileges = [ 'groups:chat', 'groups:upload:post:image', 'groups:signature', 'groups:search:content', 'groups:search:users', 'groups:search:tags', 'groups:view:users', 'groups:view:tags', 'groups:view:groups', @@ -436,8 +441,6 @@ async function giveGlobalPrivileges() { } async function createCategories() { - const Categories = require('./categories'); - const db = require('./database'); const cids = await db.getSortedSetRange('categories:cid', 0, -1); if (Array.isArray(cids) && cids.length) { console.log(`Categories OK. Found ${cids.length} categories.`); @@ -456,21 +459,15 @@ async function createCategories() { } async function createMenuItems() { - const db = require('./database'); const exists = await db.exists('navigation:enabled'); if (exists) { return; } - const navigation = require('./navigation/admin'); - const data = require('../install/data/navigation.json'); await navigation.save(data); } async function createWelcomePost() { - const db = require('./database'); - const Topics = require('./topics'); - const [content, numTopics] = await Promise.all([ fs.promises.readFile(path.join(__dirname, '../', 'install/data/welcome.md'), 'utf8'), db.getObjectField('global', 'topicCount'), @@ -507,8 +504,7 @@ async function enableDefaultPlugins() { try { customDefaults = Array.isArray(customDefaults) ? customDefaults : JSON.parse(customDefaults); defaultEnabled = defaultEnabled.concat(customDefaults); - } catch (e) { - // Invalid value received + } catch (e: any) { // Invalid value received winston.info('[install/enableDefaultPlugins] Invalid defaultPlugins value received. Ignoring.'); } } @@ -516,14 +512,11 @@ async function enableDefaultPlugins() { defaultEnabled = _.uniq(defaultEnabled); winston.info('[install/enableDefaultPlugins] activating default plugins', defaultEnabled); - - const db = require('./database'); const order = defaultEnabled.map((plugin, index) => index); await db.sortedSetAdd('plugins:active', order, defaultEnabled); } async function setCopyrightWidget() { - const db = require('./database'); const [footerJSON, footer] = await Promise.all([ fs.promises.readFile(path.join(__dirname, '../', 'install/data/footer.json'), 'utf8'), db.getObjectField('widgets:global', 'footer'), @@ -535,7 +528,6 @@ async function setCopyrightWidget() { } async function copyFavicon() { - const file = require('./file'); const pathToIco = path.join(nconf.get('upload_path'), 'system', 'favicon.ico'); const defaultIco = path.join(nconf.get('base_dir'), 'public', 'favicon.ico'); const targetExists = await file.exists(pathToIco); @@ -544,17 +536,16 @@ async function copyFavicon() { if (defaultExists && !targetExists) { try { await fs.promises.copyFile(defaultIco, pathToIco); - } catch (err) { + } catch (err: any) { winston.error(`Cannot copy favicon.ico\n${err.stack}`); } } } async function checkUpgrade() { - const upgrade = require('./upgrade'); try { await upgrade.check(); - } catch (err) { + } catch (err: any) { if (err.message === 'schema-out-of-date') { await upgrade.run(); return; @@ -586,10 +577,10 @@ install.setup = async function () { ...adminInfo, }; return data; - } catch (err) { + } catch (err: any) { if (err) { winston.warn(`NodeBB Setup Aborted.\n ${err.stack}`); - process.exit(1); + (process as any).exit(1); } } }; @@ -603,8 +594,8 @@ install.save = async function (server_conf) { let currentConfig = {}; try { - currentConfig = require(serverConfigPath); - } catch (err) { + currentConfig = require(serverConfigPath); + } catch (err: any) { if (err.code !== 'MODULE_NOT_FOUND') { throw err; } @@ -616,3 +607,5 @@ install.save = async function (server_conf) { file: serverConfigPath, }); }; + +export default install; \ No newline at end of file diff --git a/src/languages.ts b/src/languages.ts index d307a439df..6e4c30e263 100644 --- a/src/languages.ts +++ b/src/languages.ts @@ -1,12 +1,12 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const utils = require('./utils'); -const { paths } = require('./constants'); -const plugins = require('./plugins'); +import fs from 'fs'; +import path from 'path'; +import utils from './utils'; +import { paths } from './constants'; +import plugins from './plugins'; -const Languages = module.exports; +const Languages = {} as any; const languagesPath = path.join(__dirname, '../build/public/language'); const files = fs.readdirSync(path.join(paths.nodeModules, '/timeago/locales')); @@ -38,7 +38,7 @@ Languages.listCodes = async function () { codeCache = parsed.languages; return parsed.languages; - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return []; } @@ -60,7 +60,7 @@ Languages.list = async function () { const file = await fs.promises.readFile(configPath, 'utf8'); const lang = JSON.parse(file); return lang; - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return; } @@ -84,4 +84,7 @@ Languages.userTimeagoCode = async function (userLang) { return ''; }; -require('./promisify')(Languages); +import promisify from './promisify'; +promisify(Languages); + +export default Languages; \ No newline at end of file diff --git a/src/logger.ts b/src/logger.ts index 5c2b01426f..a0fd8b3c4f 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -4,14 +4,14 @@ * Logger module: ability to dynamically turn on/off logging for http requests & socket.io events */ -const fs = require('fs'); -const path = require('path'); -const winston = require('winston'); -const util = require('util'); -const morgan = require('morgan'); +import fs from 'fs'; +import path from 'path'; +import winston from 'winston'; +import util from 'util'; +import morgan from 'morgan'; -const file = require('./file'); -const meta = require('./meta'); +import file from './file'; +import meta from './meta'; const opts = { @@ -24,12 +24,12 @@ const opts = { ofn: null, }, streams: { - log: { f: process.stdout }, + log: { f: (process as any).stdout }, }, }; /* -- Logger -- */ -const Logger = module.exports; +const Logger = {} as any; Logger.init = function (app) { opts.express.app = app; @@ -62,7 +62,7 @@ Logger.setup_one_log = function (value) { if (stream) { opts.streams.log.f = stream; } else { - opts.streams.log.f = process.stdout; + opts.streams.log.f = (process as any).stdout; } } else { Logger.close(opts.streams.log); @@ -92,13 +92,13 @@ Logger.open = function (value) { }); } } else { - stream = process.stdout; + stream = (process as any).stdout; } return stream; }; Logger.close = function (stream) { - if (stream.f !== process.stdout && stream.f) { + if (stream.f !== (process as any).stdout && stream.f) { stream.end(); } stream.f = null; @@ -116,7 +116,7 @@ Logger.monitorConfig = function (socket, data) { Logger.express_open = function () { if (opts.express.set !== 1) { opts.express.set = 1; - opts.express.app.use(Logger.expressLogger); + (opts.express.app as any).use(Logger.expressLogger); } /* * Always initialize "ofn" (original function) with the original logger function @@ -144,7 +144,7 @@ Logger.prepare_io_string = function (_type, _uid, _args) { */ try { return `io: ${_uid} ${_type} ${util.inspect(Array.prototype.slice.call(_args), { depth: 3 })}\n`; - } catch (err) { + } catch (err: any) { winston.info('Logger.prepare_io_string: Failed', err); return 'error'; } @@ -198,7 +198,7 @@ Logger.io_one = function (socket, uid) { try { method.apply(socket, args); - } catch (err) { + } catch (err: any) { winston.info(errorMsg, err); } }; @@ -215,3 +215,5 @@ Logger.io_one = function (socket, uid) { socket.onevent = override($onevent, 'on', 'Logger.io_one: $emit.apply: Failed'); } }; + +export default Logger; \ No newline at end of file diff --git a/src/messaging/create.ts b/src/messaging/create.ts index d78a0afe4c..01a337abcc 100644 --- a/src/messaging/create.ts +++ b/src/messaging/create.ts @@ -1,11 +1,11 @@ 'use strict'; -const meta = require('../meta'); -const plugins = require('../plugins'); -const db = require('../database'); -const user = require('../user'); +import meta from '../meta'; +import plugins from '../plugins'; +import db from '../database'; +import user from '../user'; -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.sendMessage = async (data) => { await Messaging.checkContent(data.content); const inRoom = await Messaging.isUserInRoom(data.uid, data.roomId); @@ -43,8 +43,8 @@ module.exports = function (Messaging) { roomId: data.roomId, deleted: 0, system: data.system || 0, - }; - + } as any; + if (data.ip) { message.ip = data.ip; } diff --git a/src/messaging/data.ts b/src/messaging/data.ts index 6839037678..b58dfc4455 100644 --- a/src/messaging/data.ts +++ b/src/messaging/data.ts @@ -1,15 +1,14 @@ 'use strict'; -const validator = require('validator'); - -const db = require('../database'); -const user = require('../user'); -const utils = require('../utils'); -const plugins = require('../plugins'); +import validator from 'validator'; +import db from '../database'; +import user from '../user'; +import utils from '../utils'; +import plugins from '../plugins'; const intFields = ['timestamp', 'edited', 'fromuid', 'roomId', 'deleted', 'system']; -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.newMessageCutoff = 1000 * 60 * 3; Messaging.getMessagesFields = async (mids, fields) => { diff --git a/src/messaging/delete.ts b/src/messaging/delete.ts index 341bafda6b..5e48020a74 100644 --- a/src/messaging/delete.ts +++ b/src/messaging/delete.ts @@ -1,8 +1,7 @@ 'use strict'; +import sockets from '../socket.io'; -const sockets = require('../socket.io'); - -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.deleteMessage = async (mid, uid) => await doDeleteRestore(mid, 1, uid); Messaging.restoreMessage = async (mid, uid) => await doDeleteRestore(mid, 0, uid); diff --git a/src/messaging/edit.ts b/src/messaging/edit.ts index 85cad068ab..2387ddbe62 100644 --- a/src/messaging/edit.ts +++ b/src/messaging/edit.ts @@ -1,14 +1,13 @@ 'use strict'; -const meta = require('../meta'); -const user = require('../user'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); - -const sockets = require('../socket.io'); +import meta from '../meta'; +import user from '../user'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import sockets from '../socket.io'; -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.editMessage = async (uid, mid, roomId, content) => { await Messaging.checkContent(content); const raw = await Messaging.getMessageField(mid, 'content'); diff --git a/src/messaging/index.ts b/src/messaging/index.ts index 6ad192ef7f..7018e311e7 100644 --- a/src/messaging/index.ts +++ b/src/messaging/index.ts @@ -1,24 +1,30 @@ 'use strict'; +import validator from 'validator'; +import db from '../database'; +import user from '../user'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import meta from '../meta'; +import utils from '../utils'; -const validator = require('validator'); +const Messaging = {} as any; -const db = require('../database'); -const user = require('../user'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const meta = require('../meta'); -const utils = require('../utils'); +import data from './data'; +import create from './create'; +import deleteMessage from './delete'; +import edit from './edit'; +import rooms from './rooms'; +import unread from './unread'; +import notifications from './notifications'; -const Messaging = module.exports; - -require('./data')(Messaging); -require('./create')(Messaging); -require('./delete')(Messaging); -require('./edit')(Messaging); -require('./rooms')(Messaging); -require('./unread')(Messaging); -require('./notifications')(Messaging); +data(Messaging); +create(Messaging); +deleteMessage(Messaging); +edit(Messaging); +rooms(Messaging); +unread(Messaging); +notifications(Messaging); Messaging.messageExists = async mid => db.exists(`message:${mid}`); @@ -303,4 +309,6 @@ Messaging.canViewMessage = async (mids, roomId, uid) => { return single ? canView.pop() : canView; }; -require('../promisify')(Messaging); +import promisify from '../promisify'; +promisify(Messaging); +export default Messaging \ No newline at end of file diff --git a/src/messaging/notifications.ts b/src/messaging/notifications.ts index 1c04d4562d..a33bb39207 100644 --- a/src/messaging/notifications.ts +++ b/src/messaging/notifications.ts @@ -1,14 +1,13 @@ 'use strict'; -const winston = require('winston'); +import winston from 'winston'; +import user from '../user'; +import notifications from '../notifications'; +import sockets from '../socket.io'; +import plugins from '../plugins'; +import meta from '../meta'; -const user = require('../user'); -const notifications = require('../notifications'); -const sockets = require('../socket.io'); -const plugins = require('../plugins'); -const meta = require('../meta'); - -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.notifyQueue = {}; // Only used to notify a user of a new chat message, see Messaging.notifyUser Messaging.notifyUsersInRoom = async (fromUid, roomId, messageObj) => { @@ -20,7 +19,7 @@ module.exports = function (Messaging) { fromUid: fromUid, message: messageObj, uids: uids, - }; + } as any; data = await plugins.hooks.fire('filter:messaging.notify', data); if (!data || !data.uids || !data.uids.length) { return; @@ -50,7 +49,7 @@ module.exports = function (Messaging) { queueObj.timeout = setTimeout(async () => { try { await sendNotifications(fromUid, uids, roomId, queueObj.message); - } catch (err) { + } catch (err: any) { winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`); } }, meta.config.notificationSendDelay * 1000); diff --git a/src/messaging/rooms.ts b/src/messaging/rooms.ts index 948fd88027..ea08b3dad7 100644 --- a/src/messaging/rooms.ts +++ b/src/messaging/rooms.ts @@ -1,14 +1,13 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import db from '../database'; +import user from '../user'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import meta from '../meta'; -const db = require('../database'); -const user = require('../user'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const meta = require('../meta'); - -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.getRoomData = async (roomId) => { const data = await db.getObject(`chat:room:${roomId}`); if (!data) { diff --git a/src/messaging/unread.ts b/src/messaging/unread.ts index 169374045f..e529612798 100644 --- a/src/messaging/unread.ts +++ b/src/messaging/unread.ts @@ -1,9 +1,9 @@ 'use strict'; -const db = require('../database'); -const sockets = require('../socket.io'); +import db from '../database'; +import sockets from '../socket.io'; -module.exports = function (Messaging) { +export default function (Messaging) { Messaging.getUnreadCount = async (uid) => { if (parseInt(uid, 10) <= 0) { return 0; diff --git a/src/meta/aliases.ts b/src/meta/aliases.ts index d5eb42aa89..d96fae7a97 100644 --- a/src/meta/aliases.ts +++ b/src/meta/aliases.ts @@ -1,9 +1,9 @@ 'use strict'; -const _ = require('lodash'); -const chalk = require('chalk'); +import _ from 'lodash'; +import chalk from 'chalk'; -const aliases = { +export const aliases = { 'plugin static dirs': ['staticdirs'], 'requirejs modules': ['rjs', 'modules'], 'client js bundle': ['clientjs', 'clientscript', 'clientscripts'], @@ -20,9 +20,7 @@ const aliases = { languages: ['lang', 'i18n'], }; -exports.aliases = aliases; - -function buildTargets() { +export function buildTargets() { let length = 0; const output = Object.keys(aliases).map((name) => { const arr = aliases[name]; @@ -32,7 +30,7 @@ function buildTargets() { return [name, arr.join(', ')]; }).map(tuple => ` ${chalk.magenta(_.padEnd(`"${tuple[0]}"`, length + 2))} | ${tuple[1]}`).join('\n'); - process.stdout.write( + (process as any).stdout.write( '\n\n Build targets:\n' + `${chalk.green(`\n ${_.padEnd('Target', length + 2)} | Aliases`)}` + `${chalk.blue('\n ------------------------------------------------------\n')}` + @@ -40,4 +38,3 @@ function buildTargets() { ); } -exports.buildTargets = buildTargets; diff --git a/src/meta/blacklist.ts b/src/meta/blacklist.ts index 8e3bc7b1f7..ba0d43a451 100644 --- a/src/meta/blacklist.ts +++ b/src/meta/blacklist.ts @@ -1,16 +1,15 @@ 'use strict'; -const ipaddr = require('ipaddr.js'); -const winston = require('winston'); -const _ = require('lodash'); -const validator = require('validator'); +import ipaddr from 'ipaddr.js'; +import winston from 'winston'; +import _ from 'lodash'; +import validator from 'validator'; +import db from '../database'; +import pubsub from '../pubsub'; +import plugins from '../plugins'; +import analytics from '../analytics'; -const db = require('../database'); -const pubsub = require('../pubsub'); -const plugins = require('../plugins'); -const analytics = require('../analytics'); - -const Blacklist = module.exports; +const Blacklist = {} as any; Blacklist._rules = {}; Blacklist.load = async function () { @@ -56,7 +55,7 @@ Blacklist.test = async function (clientIp) { let addr; try { addr = ipaddr.parse(clientIp); - } catch (err) { + } catch (err: any) { winston.error(`[meta/blacklist] Error parsing client IP : ${clientIp}`); throw err; } @@ -75,12 +74,12 @@ Blacklist.test = async function (clientIp) { try { // To return test failure, pass back an error in callback await plugins.hooks.fire('filter:blacklist.test', { ip: clientIp }); - } catch (err) { + } catch (err: any) { analytics.increment('blacklist'); throw err; } } else { - const err = new Error('[[error:blacklisted-ip]]'); + const err: any = new Error('[[error:blacklisted-ip]]'); err.code = 'blacklisted-ip'; analytics.increment('blacklist'); @@ -90,10 +89,10 @@ Blacklist.test = async function (clientIp) { Blacklist.validate = function (rules) { rules = (rules || '').split('\n'); - const ipv4 = []; - const ipv6 = []; - const cidr = []; - const invalid = []; + const ipv4 = [] as any[]; + const ipv6 = [] as any[]; + const cidr = [] as any[]; + const invalid = [] as any[]; let duplicateCount = 0; const inlineCommentMatch = /#.*$/; @@ -117,15 +116,13 @@ Blacklist.validate = function (rules) { let isRange = false; try { addr = ipaddr.parse(rule); - } catch (e) { - // Do nothing + } catch (e: any) { // Do nothing } try { addr = ipaddr.parseCIDR(rule); isRange = true; - } catch (e) { - // Do nothing + } catch (e: any) { // Do nothing } if (!addr || whitelist.includes(rule)) { diff --git a/src/meta/build.ts b/src/meta/build.ts index 1941291020..43704aae04 100644 --- a/src/meta/build.ts +++ b/src/meta/build.ts @@ -1,15 +1,22 @@ 'use strict'; -const os = require('os'); -const winston = require('winston'); -const nconf = require('nconf'); -const _ = require('lodash'); -const path = require('path'); -const mkdirp = require('mkdirp'); -const chalk = require('chalk'); +import os from 'os'; +import winston from 'winston'; +import nconf from 'nconf'; +import _ from 'lodash'; +import path from 'path'; +import mkdirp from 'mkdirp'; +import chalk from 'chalk'; +import * as cacheBuster from './cacheBuster'; +import { aliases } from './aliases'; +import db from '../database'; +import plugins from '../plugins'; +import webpack from 'webpack'; +import fs from 'fs'; +import util from 'util'; +import promisify from '../promisify'; + -const cacheBuster = require('./cacheBuster'); -const { aliases } = require('./aliases'); let meta; @@ -59,22 +66,20 @@ const aliasMap = Object.keys(aliases).reduce((prev, key) => { return prev; }, {}); -async function beforeBuild(targets) { - const db = require('../database'); - process.stdout.write(`${chalk.green(' started')}\n`); +export async function beforeBuild(targets) { + (process as any).stdout.write(`${chalk.green(' started')}\n`); try { await db.init(); - meta = require('./index'); await meta.themes.setupPaths(); - const plugins = require('../plugins'); await plugins.prepareForBuild(targets); await mkdirp(path.join(__dirname, '../../build/public')); - } catch (err) { + } catch (err: any) { winston.error(`[build] Encountered error preparing for build\n${err.stack}`); throw err; } } + const allTargets = Object.keys(targetHandlers).filter(name => typeof targetHandlers[name] === 'function'); async function buildTargets(targets, parallel, options) { @@ -89,7 +94,7 @@ async function buildTargets(targets, parallel, options) { ); // run webpack after jstargets are done, no need to wait for css/templates etc. if (options.webpack || options.watch) { - await exports.webpack(options); + await webpack(options); } } if (parallel) { @@ -105,7 +110,7 @@ async function buildTargets(targets, parallel, options) { await step(target, parallel, `${_.padStart(target, length)} `); } if (options.webpack || options.watch) { - await exports.webpack(options); + await webpack(options); } } } @@ -118,13 +123,13 @@ async function step(target, parallel, targetStr) { const time = (Date.now() - startTime) / 1000; winston.info(`[build] ${targetStr} build completed in ${time}sec`); - } catch (err) { + } catch (err: any) { winston.error(`[build] ${targetStr} build failed`); throw err; } } -exports.build = async function (targets, options) { +export const build = async function (targets, options) { if (!options) { options = {}; } @@ -196,23 +201,18 @@ exports.build = async function (targets, options) { const totalTime = (Date.now() - startTime) / 1000; await cacheBuster.write(); winston.info(`[build] Asset compilation successful. Completed in ${totalTime}sec.`); - } catch (err) { + } catch (err: any) { winston.error(`[build] Encountered error during build step\n${err.stack ? err.stack : err}`); throw err; } }; function getWebpackConfig() { - return require(process.env.NODE_ENV !== 'development' ? '../../webpack.prod' : '../../webpack.dev'); + return require((process as any).env.NODE_ENV !== 'development' ? '../../webpack.prod' : '../../webpack.dev'); } -exports.webpack = async function (options) { +export const webpackFn = async function (options) { winston.info(`[build] ${(options.watch ? 'Watching' : 'Bundling')} with Webpack.`); - const webpack = require('webpack'); - const fs = require('fs'); - const util = require('util'); - const plugins = require('../plugins/data'); - const activePlugins = (await plugins.getActive()).map(p => p.id); if (!activePlugins.includes('nodebb-plugin-composer-default')) { activePlugins.push('nodebb-plugin-composer-default'); @@ -240,7 +240,7 @@ exports.webpack = async function (options) { const statsJson = stats.toJson(); winston.info(`[build] ${(options.watch ? 'Watching' : 'Bundling')} took ${statsJson.time} ms`); } - } catch (err) { + } catch (err: any) { console.error(err.stack || err); if (err.details) { console.error(err.details); @@ -248,8 +248,7 @@ exports.webpack = async function (options) { } }; -exports.buildAll = async function () { - await exports.build(allTargets, { webpack: true }); +export const buildAll = async function () { + await build(allTargets, { webpack: true }); }; -require('../promisify')(exports); diff --git a/src/meta/cacheBuster.ts b/src/meta/cacheBuster.ts index 55f35764a9..630f99caaf 100644 --- a/src/meta/cacheBuster.ts +++ b/src/meta/cacheBuster.ts @@ -1,9 +1,11 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const mkdirp = require('mkdirp'); -const winston = require('winston'); +import fs from 'fs'; +import path from 'path'; +import mkdirp from 'mkdirp'; +import winston from 'winston'; +import promisify from '../promisify'; + const filePath = path.join(__dirname, '../../build/cache-buster'); @@ -14,12 +16,16 @@ function generate() { return (Math.random() * 1e18).toString(32).slice(0, 11); } -exports.write = async function write() { +export const write = async function write() { await mkdirp(path.dirname(filePath)); await fs.promises.writeFile(filePath, generate()); }; -exports.read = async function read() { +promisify({ + write +}); + +export const read = async function read() { if (cached) { return cached; } @@ -32,10 +38,12 @@ exports.read = async function read() { cached = buster; return cached; - } catch (err) { + } catch (err: any) { winston.warn('[cache-buster] could not read cache buster', err); return generate(); } }; +promisify({ + read +}); -require('../promisify')(exports); diff --git a/src/meta/configs.ts b/src/meta/configs.ts index ca53dc1494..223a8418bc 100644 --- a/src/meta/configs.ts +++ b/src/meta/configs.ts @@ -1,21 +1,22 @@ 'use strict'; -const nconf = require('nconf'); -const path = require('path'); -const winston = require('winston'); +import nconf from 'nconf'; +import path from 'path'; +import winston from 'winston'; +import db from '../database'; +import pubsub from '../pubsub'; +import plugins from '../plugins'; +import utils from '../utils'; +import Meta from './index'; +import * as cacheBuster from './cacheBuster'; +//@ts-ignore +import defaults from '../../install/data/defaults.json'; +import sass from '../utils'; +import image from '../image'; -const db = require('../database'); -const pubsub = require('../pubsub'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const Meta = require('./index'); -const cacheBuster = require('./cacheBuster'); -const defaults = require('../../install/data/defaults.json'); -const Configs = module.exports; - -Meta.config = {}; +const Configs = {} as any; // called after data is loaded from db function deserialize(config) { @@ -44,7 +45,7 @@ function deserialize(config) { } else if (Array.isArray(defaults[key]) && !Array.isArray(config[key])) { try { deserialized[key] = JSON.parse(config[key] || '[]'); - } catch (err) { + } catch (err: any) { winston.error(err.stack); deserialized[key] = defaults[key]; } @@ -190,7 +191,7 @@ Configs.registerHooks = () => { Configs.cookie = { get: () => { - const cookie = {}; + const cookie = {} as any; if (nconf.get('cookieDomain') || Meta.config.cookieDomain) { cookie.domain = nconf.get('cookieDomain') || Meta.config.cookieDomain; @@ -240,20 +241,19 @@ async function saveRenderedCss(data) { if (!data.customCSS) { return; } - const sass = require('../utils').getSass(); + sass.getSass(); const scssOutput = await sass.compileStringAsync(data.customCSS, {}); data.renderedCustomCSS = scssOutput.css.toString(); } async function getLogoSize(data) { - const image = require('../image'); if (!data['brand:logo']) { return; } let size; try { size = await image.size(path.join(nconf.get('upload_path'), 'system', 'site-logo-x50.png')); - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { // For whatever reason the x50 logo wasn't generated, gracefully error out winston.warn('[logo] The email-safe logo doesn\'t seem to have been created, please re-upload your site logo.'); @@ -284,3 +284,6 @@ pubsub.on('config:update', (config) => { updateLocalConfig(config); } }); + +Meta.config = Configs; +export default Configs; \ No newline at end of file diff --git a/src/meta/css.ts b/src/meta/css.ts index 9bcb78ea38..ce1ef6a8ee 100644 --- a/src/meta/css.ts +++ b/src/meta/css.ts @@ -1,20 +1,20 @@ 'use strict'; -const winston = require('winston'); -const nconf = require('nconf'); -const fs = require('fs'); -const util = require('util'); -const path = require('path'); -const rimraf = require('rimraf'); +import winston from 'winston'; +import nconf from 'nconf'; +import fs from 'fs'; +import util from 'util'; +import path from 'path'; +import rimraf from 'rimraf'; +import plugins from '../plugins'; +import db from '../database'; +import file from '../file'; +import minifier from './minifier'; const rimrafAsync = util.promisify(rimraf); -const plugins = require('../plugins'); -const db = require('../database'); -const file = require('../file'); -const minifier = require('./minifier'); -const CSS = module.exports; +const CSS = {} as any; CSS.supportedSkins = [ 'cerulean', 'cosmo', 'cyborg', 'darkly', 'flatly', 'journal', 'litera', @@ -216,7 +216,7 @@ CSS.buildBundle = async function (target, fork) { } const data = await getBundleMetadata(target); - const minify = process.env.NODE_ENV !== 'development'; + const minify = (process as any).env.NODE_ENV !== 'development'; const { ltr, rtl } = await minifier.css.bundle(data.imports, data.paths, minify, fork); await Promise.all([ @@ -225,3 +225,5 @@ CSS.buildBundle = async function (target, fork) { ]); return [ltr.code, rtl.code]; }; + +export default CSS; diff --git a/src/meta/debugFork.ts b/src/meta/debugFork.ts index 2e61972e33..296d929f11 100644 --- a/src/meta/debugFork.ts +++ b/src/meta/debugFork.ts @@ -1,22 +1,22 @@ 'use strict'; -const { fork } = require('child_process'); +import { fork } from 'child_process'; -let debugArg = process.execArgv.find(arg => /^--(debug|inspect)/.test(arg)); +let debugArg: any = (process as any).execArgv.find(arg => /^--(debug|inspect)/.test(arg)); const debugging = !!debugArg; debugArg = debugArg ? debugArg.replace('-brk', '').split('=') : ['--debug', 5859]; let lastAddress = parseInt(debugArg[1], 10); /** - * child-process.fork, but safe for use in debuggers + * child-(process as any).fork, but safe for use in debuggers * @param {string} modulePath * @param {string[]} [args] * @param {any} [options] */ -function debugFork(modulePath, args, options) { - let execArgv = []; - if (global.v8debug || debugging) { +function debugFork(modulePath, args?, options?) { + let execArgv = [] as any[]; + if ((global as any).v8debug || debugging) { lastAddress += 1; execArgv = [`${debugArg[0]}=${lastAddress}`, '--nolazy']; @@ -34,4 +34,4 @@ function debugFork(modulePath, args, options) { } debugFork.debugging = debugging; -module.exports = debugFork; +export default debugFork; diff --git a/src/meta/dependencies.ts b/src/meta/dependencies.ts index 5bb2a73c2a..91887d068a 100644 --- a/src/meta/dependencies.ts +++ b/src/meta/dependencies.ts @@ -1,16 +1,15 @@ 'use strict'; -const path = require('path'); -const fs = require('fs'); +import path from 'path'; +import fs from 'fs'; +import semver from 'semver'; +import winston from 'winston'; +import chalk from 'chalk'; +//@ts-ignore +import pkg from '../../package.json'; +import { paths, pluginNamePattern } from '../constants'; -const semver = require('semver'); -const winston = require('winston'); -const chalk = require('chalk'); - -const pkg = require('../../package.json'); -const { paths, pluginNamePattern } = require('../constants'); - -const Dependencies = module.exports; +const Dependencies = {} as any; let depsMissing = false; let depsOutdated = false; @@ -24,7 +23,7 @@ Dependencies.check = async function () { if (depsMissing) { throw new Error('dependencies-missing'); - } else if (depsOutdated && global.env !== 'development') { + } else if (depsOutdated && (global as any).env !== 'development') { throw new Error('dependencies-out-of-date'); } }; @@ -36,7 +35,7 @@ Dependencies.checkModule = async function (moduleName) { const satisfies = Dependencies.doesSatisfy(pkgData, pkg.dependencies[moduleName]); return satisfies; - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT' && pluginNamePattern.test(moduleName)) { winston.warn(`[meta/dependencies] Bundled plugin ${moduleName} not found, skipping dependency check.`); return true; @@ -48,8 +47,7 @@ Dependencies.checkModule = async function (moduleName) { Dependencies.parseModuleData = function (moduleName, pkgData) { try { pkgData = JSON.parse(pkgData); - } catch (e) { - winston.warn(`[${chalk.red('missing')}] ${chalk.bold(moduleName)} is a required dependency but could not be found\n`); +} catch (e: any) { winston.warn(`[${chalk.red('missing')}] ${chalk.bold(moduleName)} is a required dependency but could not be found\n`); depsMissing = true; return null; } @@ -69,3 +67,5 @@ Dependencies.doesSatisfy = function (moduleData, packageJSONVersion) { } return satisfies; }; + +export default Dependencies; \ No newline at end of file diff --git a/src/meta/errors.ts b/src/meta/errors.ts index 1d2949c28a..c38256a0a4 100644 --- a/src/meta/errors.ts +++ b/src/meta/errors.ts @@ -1,13 +1,13 @@ 'use strict'; -const winston = require('winston'); -const validator = require('validator'); -const cronJob = require('cron').CronJob; +import winston from 'winston'; +import validator from 'validator'; +import { CronJob } from 'cron'; +const cronJob = CronJob; +import db from '../database'; +import analytics from '../analytics'; -const db = require('../database'); -const analytics = require('../analytics'); - -const Errors = module.exports; +const Errors = {} as any; let counters = {}; @@ -28,7 +28,7 @@ Errors.writeData = async function () { /* eslint-disable no-await-in-loop */ await db.sortedSetIncrBy('errors:404', _counters[key], key); } - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }; @@ -54,3 +54,5 @@ Errors.get = async function (escape) { Errors.clear = async function () { await db.delete('errors:404'); }; + +export default Errors; \ No newline at end of file diff --git a/src/meta/index.ts b/src/meta/index.ts index 487c53df60..a91e293b8a 100644 --- a/src/meta/index.ts +++ b/src/meta/index.ts @@ -1,37 +1,33 @@ 'use strict'; -const winston = require('winston'); -const os = require('os'); -const nconf = require('nconf'); - -const pubsub = require('../pubsub'); -const slugify = require('../slugify'); - -const Meta = module.exports; +const Meta = {} as any; +import winston from 'winston'; +import os from 'os'; +import nconf from 'nconf'; +import pubsub from '../pubsub'; +import slugify from '../slugify'; +import user from '../user'; +import groups from '../groups'; +import promisify from '../promisify'; Meta.reloadRequired = false; - -Meta.configs = require('./configs'); -Meta.themes = require('./themes'); -Meta.js = require('./js'); -Meta.css = require('./css'); -Meta.settings = require('./settings'); -Meta.logs = require('./logs'); -Meta.errors = require('./errors'); -Meta.tags = require('./tags'); -Meta.dependencies = require('./dependencies'); -Meta.templates = require('./templates'); -Meta.blacklist = require('./blacklist'); -Meta.languages = require('./languages'); - +Meta.themes = require('./themes').default; +Meta.js = require('./js').default; +Meta.css = require('./css').default; +Meta.settings = require('./settings').default; +Meta.logs = require('./logs').default; +Meta.errors = require('./errors').default; +Meta.tags = require('./tags').default; +Meta.dependencies = require('./dependencies').default; +Meta.templates = require('./templates').default; +Meta.blacklist = require('./blacklist').default; +Meta.languages = require('./languages').default; /* Assorted */ Meta.userOrGroupExists = async function (slug) { if (!slug) { throw new Error('[[error:invalid-data]]'); } - const user = require('../user'); - const groups = require('../groups'); slug = slugify(slug); const [userExists, groupExists] = await Promise.all([ user.existsBySlug(slug), @@ -54,8 +50,8 @@ Meta.restart = function () { }; function restart() { - if (process.send) { - process.send({ + if ((process as any).send) { + (process as any).send({ action: 'restart', }); } else { @@ -70,4 +66,5 @@ Meta.getSessionTTLSeconds = function () { return ttl; }; -require('../promisify')(Meta); +promisify(Meta); +export default Meta; diff --git a/src/meta/js.ts b/src/meta/js.ts index aa3f996cd4..8a8ade46b3 100644 --- a/src/meta/js.ts +++ b/src/meta/js.ts @@ -1,18 +1,20 @@ 'use strict'; -const path = require('path'); -const fs = require('fs'); -const util = require('util'); -const mkdirp = require('mkdirp'); -const rimraf = require('rimraf'); +import path from 'path'; +import fs from 'fs'; +import util from 'util'; +import mkdirp from 'mkdirp'; +import rimraf from 'rimraf'; +import file from '../file'; +import plugins from '../plugins'; +import minifier from './minifier'; +import fse from 'fs-extra'; + const rimrafAsync = util.promisify(rimraf); -const file = require('../file'); -const plugins = require('../plugins'); -const minifier = require('./minifier'); -const JS = module.exports; +const JS = {} as any; JS.scripts = { base: [ @@ -65,8 +67,6 @@ async function clearModules() { JS.buildModules = async function () { await clearModules(); - - const fse = require('fs-extra'); await fse.copy( path.join(__dirname, `../../public/src`), path.join(__dirname, `../../build/public/src`) @@ -133,3 +133,5 @@ JS.buildBundle = async function (target, fork) { JS.killMinifier = function () { minifier.killAll(); }; + +export default JS; \ No newline at end of file diff --git a/src/meta/languages.ts b/src/meta/languages.ts index 4d845cc2e1..d51c80cbb6 100644 --- a/src/meta/languages.ts +++ b/src/meta/languages.ts @@ -1,20 +1,19 @@ 'use strict'; -const _ = require('lodash'); -const nconf = require('nconf'); -const path = require('path'); -const fs = require('fs'); -const util = require('util'); -let mkdirp = require('mkdirp'); - -mkdirp = mkdirp.hasOwnProperty('native') ? mkdirp : util.promisify(mkdirp); -const rimraf = require('rimraf'); +import _ from 'lodash'; +import nconf from 'nconf'; +import path from 'path'; +import fs from 'fs'; +import util from 'util'; +import mkdirpPkg from 'mkdirp'; +const mkdirp = mkdirpPkg.hasOwnProperty('native') ? mkdirpPkg : util.promisify(mkdirpPkg); +import rimraf from 'rimraf'; const rimrafAsync = util.promisify(rimraf); -const file = require('../file'); -const Plugins = require('../plugins'); -const { paths } = require('../constants'); +import file from '../file'; +import Plugins from '../plugins'; +import { paths } from '../constants'; const buildLanguagesPath = path.join(paths.baseDir, 'build/public/language'); const coreLanguagesPath = path.join(paths.baseDir, 'public/language'); @@ -45,7 +44,7 @@ async function getTranslationMetadata() { languages = _.union(languages, Plugins.languageData.languages).sort().filter(Boolean); namespaces = _.union(namespaces, Plugins.languageData.namespaces).sort().filter(Boolean); const configLangs = nconf.get('languages'); - if (process.env.NODE_ENV === 'development' && Array.isArray(configLangs) && configLangs.length) { + if ((process as any).env.NODE_ENV === 'development' && Array.isArray(configLangs) && configLangs.length) { languages = configLangs; } // save a list of languages to `${buildLanguagesPath}/metadata.json` @@ -60,7 +59,7 @@ async function getTranslationMetadata() { } async function writeLanguageFile(language, namespace, translations) { - const dev = process.env.NODE_ENV === 'development'; + const dev = (process as any).env.NODE_ENV === 'development'; const filePath = path.join(buildLanguagesPath, language, `${namespace}.json`); await mkdirp(path.dirname(filePath)); @@ -129,14 +128,14 @@ async function assignFileToTranslations(translations, path) { try { const fileData = await fs.promises.readFile(path, 'utf8'); Object.assign(translations, JSON.parse(fileData)); - } catch (err) { + } catch (err: any) { if (err.code !== 'ENOENT') { throw err; } } } -exports.build = async function buildLanguages() { +export const build = async function buildLanguages() { await rimrafAsync(buildLanguagesPath); const data = await getTranslationMetadata(); await buildTranslations(data); diff --git a/src/meta/logs.ts b/src/meta/logs.ts index 416ed68a8c..65fb306cbc 100644 --- a/src/meta/logs.ts +++ b/src/meta/logs.ts @@ -1,9 +1,9 @@ 'use strict'; -const path = require('path'); -const fs = require('fs'); +import path from 'path'; +import fs from 'fs'; -const Logs = module.exports; +const Logs = {} as any; Logs.path = path.resolve(__dirname, '../../logs/output.log'); @@ -14,3 +14,5 @@ Logs.get = async function () { Logs.clear = async function () { await fs.promises.truncate(Logs.path, 0); }; + +export default Logs; \ No newline at end of file diff --git a/src/meta/minifier.ts b/src/meta/minifier.ts index fee6347763..3a952e0f29 100644 --- a/src/meta/minifier.ts +++ b/src/meta/minifier.ts @@ -1,19 +1,21 @@ 'use strict'; -const fs = require('fs'); -const os = require('os'); -const async = require('async'); -const winston = require('winston'); -const postcss = require('postcss'); -const autoprefixer = require('autoprefixer'); -const clean = require('postcss-clean'); -const rtlcss = require('rtlcss'); -const sass = require('../utils').getSass(); +import fs from 'fs'; +import os from 'os'; +import async from 'async'; +import winston from 'winston'; +import postcss from 'postcss'; +import autoprefixer from 'autoprefixer'; +import clean from 'postcss-clean'; +import rtlcss from 'rtlcss'; +import sassUtils from '../utils'; +import fork from './debugFork'; -const fork = require('./debugFork'); -require('../file'); // for graceful-fs +const sass = sassUtils.getSass(); -const Minifier = module.exports; +import '../file'; // for graceful-fs + +const Minifier = {} as any; const pool = []; const free = []; @@ -26,7 +28,7 @@ Object.defineProperty(Minifier, 'maxThreads', { }, set: function (val) { maxThreads = val; - if (!process.env.minifier_child) { + if (!(process as any).env.minifier_child) { winston.verbose(`[minifier] utilizing a maximum of ${maxThreads} additional threads`); } }, @@ -100,14 +102,14 @@ function forkAction(action) { }); } -const actions = {}; +const actions = {} as any; -if (process.env.minifier_child) { - process.on('message', async (message) => { +if ((process as any).env.minifier_child) { + (process as any).on('message', async (message: any) => { if (message.type === 'action') { const { action } = message; if (typeof actions[action.act] !== 'function') { - process.send({ + (process as any).send({ type: 'error', message: 'Unknown action', }); @@ -115,12 +117,12 @@ if (process.env.minifier_child) { } try { const result = await actions[action.act](action); - process.send({ + (process as any).send({ type: 'end', result: result, }); - } catch (err) { - process.send({ + } catch (err: any) { + (process as any).send({ type: 'error', message: err.stack || err.message || 'unknown error', }); @@ -198,4 +200,7 @@ Minifier.css.bundle = async function (source, paths, minify, fork) { }, fork); }; -require('../promisify')(exports); +import promisify from '../promisify'; +promisify(Minifier(exports)); + +export default Minifier; diff --git a/src/meta/settings.ts b/src/meta/settings.ts index 213b61be11..c9742f4117 100644 --- a/src/meta/settings.ts +++ b/src/meta/settings.ts @@ -1,14 +1,13 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import plugins from '../plugins'; +import Meta from './index'; +import pubsub from '../pubsub'; +import cache from '../cache'; -const db = require('../database'); -const plugins = require('../plugins'); -const Meta = require('./index'); -const pubsub = require('../pubsub'); -const cache = require('../cache'); - -const Settings = module.exports; +const Settings = {} as any; Settings.get = async function (hash) { const cached = cache.get(`settings:${hash}`); @@ -125,3 +124,5 @@ Settings.setOnEmpty = async function (hash, values) { await Settings.set(hash, empty); } }; + +export default Settings; \ No newline at end of file diff --git a/src/meta/tags.ts b/src/meta/tags.ts index 121c1c74c2..bd964d36f5 100644 --- a/src/meta/tags.ts +++ b/src/meta/tags.ts @@ -1,13 +1,12 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); +import nconf from 'nconf'; +import winston from 'winston'; +import plugins from '../plugins'; +import Meta from './index'; +import utils from '../utils'; -const plugins = require('../plugins'); -const Meta = require('./index'); -const utils = require('../utils'); - -const Tags = module.exports; +const Tags = {} as any; const url = nconf.get('url'); const relative_path = nconf.get('relative_path'); @@ -67,7 +66,7 @@ Tags.parse = async (req, data, meta, link) => { rel: 'manifest', href: `${relative_path}/manifest.webmanifest`, crossorigin: `use-credentials`, - }]; + }] as any[]; if (plugins.hooks.hasListeners('filter:search.query')) { defaultLinks.push({ @@ -267,3 +266,5 @@ async function addSiteOGImage(meta) { } }); } + +export default Tags; \ No newline at end of file diff --git a/src/meta/templates.ts b/src/meta/templates.ts index 89a68080fa..12ba8fef32 100644 --- a/src/meta/templates.ts +++ b/src/meta/templates.ts @@ -1,25 +1,23 @@ 'use strict'; -const util = require('util'); -let mkdirp = require('mkdirp'); +import util from 'util'; +import mkdirpPkg from 'mkdirp'; -mkdirp = mkdirp.hasOwnProperty('native') ? mkdirp : util.promisify(mkdirp); -const rimraf = require('rimraf'); -const winston = require('winston'); -const path = require('path'); -const fs = require('fs'); - -const nconf = require('nconf'); -const _ = require('lodash'); -const Benchpress = require('benchpressjs'); - -const plugins = require('../plugins'); -const file = require('../file'); -const { themeNamePattern, paths } = require('../constants'); +const mkdirp = mkdirpPkg.hasOwnProperty('native') ? mkdirpPkg : util.promisify(mkdirpPkg); +import rimraf from 'rimraf'; +import winston from 'winston'; +import path from 'path'; +import fs from 'fs'; +import nconf from 'nconf'; +import _ from 'lodash'; +import Benchpress from 'benchpressjs'; +import plugins from '../plugins'; +import file from '../file'; +import { themeNamePattern, paths } from '../constants'; const viewsPath = nconf.get('views_dir'); -const Templates = module.exports; +const Templates = {} as any; async function processImports(paths, templatePath, source) { const regex = //; @@ -55,14 +53,14 @@ async function getTemplateDirs(activePlugins) { return path.join(paths.nodeModules, id, plugins.pluginsData[id].templates || 'templates'); }).filter(Boolean); - let themeConfig = require(nconf.get('theme_config')); + let themeConfig = nconf.get('theme_config'); let theme = themeConfig.baseTheme; let themePath; let themeTemplates = []; while (theme) { themePath = path.join(nconf.get('themes_path'), theme); - themeConfig = require(path.join(themePath, 'theme.json')); + themeConfig = path.join(themePath, 'theme.json'); themeTemplates.push(path.join(themePath, themeConfig.templates || 'templates')); theme = themeConfig.baseTheme; @@ -137,3 +135,5 @@ async function compile() { winston.verbose('[meta/templates] Successfully compiled templates.'); } Templates.compile = compile; + +export default Templates; \ No newline at end of file diff --git a/src/meta/themes.ts b/src/meta/themes.ts index e5d519c457..cfe81d15bc 100644 --- a/src/meta/themes.ts +++ b/src/meta/themes.ts @@ -1,19 +1,18 @@ 'use strict'; -const path = require('path'); -const nconf = require('nconf'); -const winston = require('winston'); -const _ = require('lodash'); -const fs = require('fs'); +import path from 'path'; +import nconf from 'nconf'; +import winston from 'winston'; +import _ from 'lodash'; +import fs from 'fs'; +import file from '../file'; +import db from '../database'; +import Meta from './index'; +import events from '../events'; +import utils from '../utils'; +import { themeNamePattern } from '../constants'; -const file = require('../file'); -const db = require('../database'); -const Meta = require('./index'); -const events = require('../events'); -const utils = require('../utils'); -const { themeNamePattern } = require('../constants'); - -const Themes = module.exports; +const Themes = {} as any; Themes.get = async () => { const themePath = nconf.get('themes_path'); @@ -45,7 +44,7 @@ Themes.get = async () => { } return configObj; - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return false; } @@ -75,7 +74,7 @@ async function getThemes(themePath) { const themes = await getThemes(path.join(themePath, dir)); return themes.map(theme => path.join(dir, theme)); - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { return false; } @@ -99,7 +98,7 @@ Themes.set = async (data) => { throw new Error('[[error:invalid-theme-id]]'); } - let config = await fs.promises.readFile(pathToThemeJson, 'utf8'); + let config: any = await fs.promises.readFile(pathToThemeJson, 'utf8'); config = JSON.parse(config); const activePluginsConfig = nconf.get('plugins:active'); if (!activePluginsConfig) { @@ -152,7 +151,7 @@ Themes.setupPaths = async () => { const themeId = data.currentThemeId || 'nodebb-theme-harmony'; - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { winston.info(`[themes] Using theme ${themeId}`); } @@ -179,3 +178,5 @@ Themes.setPath = function (themeObj) { nconf.set('theme_templates_path', themePath); nconf.set('theme_config', path.join(nconf.get('themes_path'), themeObj.id, 'theme.json')); }; + +export default Themes; \ No newline at end of file diff --git a/src/middleware/admin.ts b/src/middleware/admin.ts index b514fb5cca..b4094a3143 100644 --- a/src/middleware/admin.ts +++ b/src/middleware/admin.ts @@ -1,20 +1,19 @@ 'use strict'; -const nconf = require('nconf'); - -const user = require('../user'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const helpers = require('./helpers'); +import nconf from 'nconf'; +import user from '../user'; +import meta from '../meta'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import helpers from './helpers'; const controllers = { api: require('../controllers/api'), helpers: require('../controllers/helpers'), -}; +} as any; -const middleware = module.exports; +const middleware = {} as any; middleware.buildHeader = helpers.try(async (req, res, next) => { res.locals.renderAdminHeader = true; @@ -86,3 +85,5 @@ middleware.checkPrivileges = helpers.try(async (req, res, next) => { res.redirect(`${nconf.get('relative_path')}/login?local=1`); } }); + +export default middleware; \ No newline at end of file diff --git a/src/middleware/assert.ts b/src/middleware/assert.ts index f91fde93f4..e0169db225 100644 --- a/src/middleware/assert.ts +++ b/src/middleware/assert.ts @@ -5,22 +5,20 @@ * payload and throw an error otherwise. */ -const path = require('path'); -const nconf = require('nconf'); +import path from 'path'; +import nconf from 'nconf'; +import file from '../file'; +import user from '../user'; +import groups from '../groups'; +import topics from '../topics'; +import posts from '../posts'; +import messaging from '../messaging'; +import flags from '../flags'; +import slugify from '../slugify'; +import helpers from './helpers'; +import controllerHelpers from '../controllers/helpers'; -const file = require('../file'); -const user = require('../user'); -const groups = require('../groups'); -const topics = require('../topics'); -const posts = require('../posts'); -const messaging = require('../messaging'); -const flags = require('../flags'); -const slugify = require('../slugify'); - -const helpers = require('./helpers'); -const controllerHelpers = require('../controllers/helpers'); - -const Assert = module.exports; +const Assert = {} as any; Assert.user = helpers.try(async (req, res, next) => { if (!await user.exists(req.params.uid)) { @@ -139,3 +137,5 @@ Assert.message = helpers.try(async (req, res, next) => { next(); }); + +export default Assert; \ No newline at end of file diff --git a/src/middleware/expose.ts b/src/middleware/expose.ts index b4ad1d7be4..a3c7eb2839 100644 --- a/src/middleware/expose.ts +++ b/src/middleware/expose.ts @@ -5,11 +5,11 @@ * into `res.locals` for use in middlewares and/or controllers down the line */ -const user = require('../user'); -const privileges = require('../privileges'); -const utils = require('../utils'); +import user from '../user'; +import privileges from '../privileges'; +import utils from '../utils'; -module.exports = function (middleware) { +export default function (middleware) { middleware.exposeAdmin = async (req, res, next) => { // Unlike `requireAdmin`, this middleware just checks the uid, and sets `isAdmin` in `res.locals` res.locals.isAdmin = false; diff --git a/src/middleware/header.ts b/src/middleware/header.ts index d8645d6471..145748aabd 100644 --- a/src/middleware/header.ts +++ b/src/middleware/header.ts @@ -1,16 +1,15 @@ 'use strict'; -const util = require('util'); - -const user = require('../user'); -const plugins = require('../plugins'); -const helpers = require('./helpers'); +import util from 'util'; +import user from '../user'; +import plugins from '../plugins'; +import helpers from './helpers'; const controllers = { api: require('../controllers/api'), -}; +} as any; -const middleware = module.exports; +const middleware = {} as any; middleware.buildHeader = helpers.try(async (req, res, next) => { res.locals.renderHeader = true; @@ -36,3 +35,5 @@ middleware.buildHeader = helpers.try(async (req, res, next) => { }); middleware.buildHeaderAsync = util.promisify(middleware.buildHeader); + +export default middleware; \ No newline at end of file diff --git a/src/middleware/headers.ts b/src/middleware/headers.ts index f6aaecd3e8..e8f140a8d6 100644 --- a/src/middleware/headers.ts +++ b/src/middleware/headers.ts @@ -1,21 +1,20 @@ 'use strict'; -const os = require('os'); -const winston = require('winston'); -const _ = require('lodash'); +import os from 'os'; +import winston from 'winston'; +import _ from 'lodash'; +import meta from '../meta'; +import languages from '../languages'; +import helpers from './helpers'; +import plugins from '../plugins'; -const meta = require('../meta'); -const languages = require('../languages'); -const helpers = require('./helpers'); -const plugins = require('../plugins'); - -module.exports = function (middleware) { +export default function (middleware) { middleware.addHeaders = helpers.try((req, res, next) => { const headers = { 'X-Powered-By': encodeURI(meta.config['powered-by'] || 'NodeBB'), 'Access-Control-Allow-Methods': encodeURI(meta.config['access-control-allow-methods'] || ''), 'Access-Control-Allow-Headers': encodeURI(meta.config['access-control-allow-headers'] || ''), - }; + } as any; if (meta.config['csp-frame-ancestors']) { headers['Content-Security-Policy'] = `frame-ancestors ${meta.config['csp-frame-ancestors']}`; @@ -42,7 +41,7 @@ module.exports = function (middleware) { originsRegex = originsRegex.map((origin) => { try { origin = new RegExp(origin.trim()); - } catch (err) { + } catch (err: any) { winston.error(`[middleware.addHeaders] Invalid RegExp For access-control-allow-origin ${origin}`); origin = null; } @@ -65,7 +64,7 @@ module.exports = function (middleware) { headers['Access-Control-Allow-Credentials'] = meta.config['access-control-allow-credentials']; } - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { headers['X-Upstream-Hostname'] = os.hostname(); } @@ -108,7 +107,7 @@ module.exports = function (middleware) { try { const codes = await languages.listCodes(); return _.uniq([defaultLang, ...codes]); - } catch (err) { + } catch (err: any) { winston.error(`[middleware/autoLocale] Could not retrieve languages codes list! ${err.stack}`); return [defaultLang]; } diff --git a/src/middleware/helpers.ts b/src/middleware/helpers.ts index e31d86299a..9601906fdf 100644 --- a/src/middleware/helpers.ts +++ b/src/middleware/helpers.ts @@ -1,19 +1,18 @@ 'use strict'; -const winston = require('winston'); -const validator = require('validator'); -const slugify = require('../slugify'); +import winston from 'winston'; +import validator from 'validator'; +import slugify from '../slugify'; +import meta from '../meta'; -const meta = require('../meta'); - -const helpers = module.exports; +const helpers = {} as any; helpers.try = function (middleware) { if (middleware && middleware.constructor && middleware.constructor.name === 'AsyncFunction') { return async function (req, res, next) { try { await middleware(req, res, next); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -21,19 +20,19 @@ helpers.try = function (middleware) { return function (req, res, next) { try { middleware(req, res, next); - } catch (err) { + } catch (err: any) { next(err); } }; }; -helpers.buildBodyClass = function (req, res, templateData = {}) { +helpers.buildBodyClass = function (req, res, templateData = {} as any) { const clean = req.path.replace(/^\/api/, '').replace(/^\/|\/$/g, ''); const parts = clean.split('/').slice(0, 3); parts.forEach((p, index) => { try { p = slugify(decodeURIComponent(p)); - } catch (err) { + } catch (err: any) { winston.error(`Error decoding URI: ${p}`); winston.error(err.stack); p = ''; @@ -66,3 +65,5 @@ helpers.buildBodyClass = function (req, res, templateData = {}) { } return parts.join(' '); }; + +export default helpers; diff --git a/src/middleware/index.ts b/src/middleware/index.ts index 82792f2cd0..2b58357a8b 100644 --- a/src/middleware/index.ts +++ b/src/middleware/index.ts @@ -1,25 +1,32 @@ 'use strict'; -const async = require('async'); -const path = require('path'); -const csrf = require('csurf'); -const validator = require('validator'); -const nconf = require('nconf'); -const toobusy = require('toobusy-js'); -const util = require('util'); +import async from 'async'; +import path from 'path'; +import csrf from 'csurf'; +import validator from 'validator'; +import nconf from 'nconf'; +import toobusy from 'toobusy-js'; +import util from 'util'; +import plugins from '../plugins'; +import meta from '../meta'; +import user from '../user'; +import groups from '../groups'; +import analytics from '../analytics'; +import privileges from '../privileges'; +import cacheCreate from '../cache/lru'; +import helpers from './helpers'; +import render from './render'; +import maintenance from './maintenance'; +import * as uploads from './uploads'; +import headers from './headers'; +import exposeMiddleware from './expose'; +import assert from './assert'; +import api from '../controllers/api'; -const plugins = require('../plugins'); -const meta = require('../meta'); -const user = require('../user'); -const groups = require('../groups'); -const analytics = require('../analytics'); -const privileges = require('../privileges'); -const cacheCreate = require('../cache/lru'); -const helpers = require('./helpers'); const controllers = { - api: require('../controllers/api'), - helpers: require('../controllers/helpers'), + api, + helpers, }; const delayCache = cacheCreate({ @@ -27,7 +34,7 @@ const delayCache = cacheCreate({ max: 200, }); -const middleware = module.exports; +const middleware = {} as any; const relative_path = nconf.get('relative_path'); @@ -54,17 +61,21 @@ middleware.ensureLoggedIn = (req, res, next) => { setImmediate(next); }; +import admin from './admin'; +import header from './header'; + Object.assign(middleware, { - admin: require('./admin'), - ...require('./header'), + admin, + ...header, }); -require('./render')(middleware); -require('./maintenance')(middleware); -require('./user')(middleware); -middleware.uploads = require('./uploads'); -require('./headers')(middleware); -require('./expose')(middleware); -middleware.assert = require('./assert'); + +render(middleware); +maintenance(middleware); +user(middleware); +middleware.uploads = uploads; +headers(middleware); +exposeMiddleware(middleware); +middleware.assert = assert; middleware.stripLeadingSlashes = function stripLeadingSlashes(req, res, next) { const target = req.originalUrl.replace(relative_path, ''); @@ -104,7 +115,7 @@ middleware.pluginHooks = helpers.try(async (req, res, next) => { middleware.validateFiles = function validateFiles(req, res, next) { if (!Array.isArray(req.files.files) || !req.files.files.length) { - return next(new Error(['[[error:invalid-files]]'])); + return next(new Error(['[[error:invalid-files]]'] as any)); } next(); @@ -172,7 +183,7 @@ middleware.privateUploads = function privateUploads(req, res, next) { }; middleware.busyCheck = function busyCheck(req, res, next) { - if (global.env === 'production' && meta.config.eventLoopCheckEnabled && toobusy()) { + if ((global as any).env === 'production' && meta.config.eventLoopCheckEnabled && toobusy()) { analytics.increment('errors:503'); res.status(503).type('text/html').sendFile(path.join(__dirname, '../../public/503.html')); } else { @@ -184,7 +195,7 @@ middleware.applyBlacklist = async function applyBlacklist(req, res, next) { try { await meta.blacklist.test(req.ip); next(); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -234,7 +245,7 @@ middleware.validateAuth = helpers.try(async (req, res, next) => { strategy: res.locals.strategy, }); next(); - } catch (err) { + } catch (err: any) { const regenerateSession = util.promisify(cb => req.session.regenerate(cb)); await regenerateSession(); req.uid = 0; @@ -253,3 +264,5 @@ middleware.checkRequired = function (fields, req, res, next) { controllers.helpers.formatApiResponse(400, res, new Error(`[[error:required-parameters-missing, ${missing.join(' ')}]]`)); }; + +export default middleware; \ No newline at end of file diff --git a/src/middleware/maintenance.ts b/src/middleware/maintenance.ts index 2e56fff8b6..a1d7e05401 100644 --- a/src/middleware/maintenance.ts +++ b/src/middleware/maintenance.ts @@ -1,13 +1,13 @@ 'use strict'; -const util = require('util'); -const nconf = require('nconf'); -const meta = require('../meta'); -const user = require('../user'); -const groups = require('../groups'); -const helpers = require('./helpers'); +import util from 'util'; +import nconf from 'nconf'; +import meta from '../meta'; +import user from '../user'; +import groups from '../groups'; +import helpers from './helpers'; -module.exports = function (middleware) { +export default function (middleware) { middleware.maintenanceMode = helpers.try(async (req, res, next) => { if (!meta.config.maintenanceMode) { return next(); diff --git a/src/middleware/ratelimit.ts b/src/middleware/ratelimit.ts index 9697c56513..092f9f12c1 100644 --- a/src/middleware/ratelimit.ts +++ b/src/middleware/ratelimit.ts @@ -1,8 +1,8 @@ 'use strict'; -const winston = require('winston'); +import winston from 'winston'; -const ratelimit = module.exports; +const ratelimit = {} as any; const allowedCalls = 100; const timeframe = 10000; @@ -30,3 +30,5 @@ ratelimit.isFlooding = function (socket) { socket.lastCallTime = now; return false; }; + +export default ratelimit; diff --git a/src/middleware/render.ts b/src/middleware/render.ts index ee716b78ac..93806ffae3 100644 --- a/src/middleware/render.ts +++ b/src/middleware/render.ts @@ -1,31 +1,30 @@ 'use strict'; -const _ = require('lodash'); -const nconf = require('nconf'); -const validator = require('validator'); -const jsesc = require('jsesc'); -const winston = require('winston'); -const semver = require('semver'); - -const navigation = require('../navigation'); -const translator = require('../translator'); -const privileges = require('../privileges'); -const languages = require('../languages'); -const plugins = require('../plugins'); -const user = require('../user'); -const topics = require('../topics'); -const messaging = require('../messaging'); -const flags = require('../flags'); -const meta = require('../meta'); -const widgets = require('../widgets'); -const utils = require('../utils'); -const helpers = require('./helpers'); -const versions = require('../admin/versions'); -const controllersHelpers = require('../controllers/helpers'); +import _ from 'lodash'; +import nconf from 'nconf'; +import validator from 'validator'; +import jsesc from 'jsesc'; +import winston from 'winston'; +import semver from 'semver'; +import navigation from '../navigation'; +import translator from '../translator'; +import privileges from '../privileges'; +import languages from '../languages'; +import plugins from '../plugins'; +import user from '../user'; +import topics from '../topics'; +import messaging from '../messaging'; +import flags from '../flags'; +import meta from '../meta'; +import widgets from '../widgets'; +import utils from '../utils'; +import helpers from './helpers'; +import * as versions from '../admin/versions'; +import controllersHelpers from '../controllers/helpers'; const relative_path = nconf.get('relative_path'); -module.exports = function (middleware) { +export default function (middleware) { middleware.processRender = function processRender(req, res, next) { // res.render post-processing, modified from here: https://gist.github.com/mrlannigan/5051687 const { render } = res; @@ -78,7 +77,7 @@ module.exports = function (middleware) { if (req.route && req.route.path === '/api/') { options.title = '[[pages:home]]'; } - req.app.set('json spaces', global.env === 'development' || req.query.pretty ? 4 : 0); + req.app.set('json spaces', (global as any).env === 'development' || req.query.pretty ? 4 : 0); return res.json(options); } const optionsString = JSON.stringify(options).replace(/<\//g, '<\\/'); @@ -107,7 +106,7 @@ module.exports = function (middleware) { try { await renderMethod(template, options, fn); - } catch (err) { + } catch (err: any) { next(err); } }; @@ -143,7 +142,7 @@ module.exports = function (middleware) { relative_path, bodyClass: options.bodyClass, widgets: options.widgets, - }; + } as any; templateValues.configJSON = jsesc(JSON.stringify(res.locals.config), { isScriptContext: true }); @@ -266,14 +265,14 @@ module.exports = function (middleware) { authentication: results.custom_header.authentication, scripts: results.scripts, 'cache-buster': meta.config['cache-buster'] || '', - env: !!process.env.NODE_ENV, + env: !!(process as any).env.NODE_ENV, title: `${acpPath || 'Dashboard'} | NodeBB Admin Control Panel`, bodyClass: options.bodyClass, version: version, latestVersion: results.latestVersion, upgradeAvailable: results.latestVersion && semver.gt(results.latestVersion, version), showManageMenu: results.privileges.superadmin || ['categories', 'privileges', 'users', 'admins-mods', 'groups', 'tags', 'settings'].some(priv => results.privileges[`admin:${priv}`]), - }; + } as any; templateValues.template = { name: res.locals.template }; templateValues.template[res.locals.template] = true; @@ -471,8 +470,9 @@ module.exports = function (middleware) { async function getLatestVersion() { try { + //@ts-ignore return await versions.getLatestVersion(); - } catch (err) { + } catch (err: any) { winston.error(`[acp] Failed to fetch latest version${err.stack}`); } return null; diff --git a/src/middleware/uploads.ts b/src/middleware/uploads.ts index 5b1e9c392f..ab779dc870 100644 --- a/src/middleware/uploads.ts +++ b/src/middleware/uploads.ts @@ -1,19 +1,19 @@ 'use strict'; -const cacheCreate = require('../cache/ttl'); -const meta = require('../meta'); -const helpers = require('./helpers'); -const user = require('../user'); +import cacheCreate from '../cache/ttl'; +import meta from '../meta'; +import helpers from './helpers'; +import user from '../user'; const cache = cacheCreate({ ttl: meta.config.uploadRateLimitCooldown * 1000, }); -exports.clearCache = function () { +export const clearCache = function () { cache.clear(); }; -exports.ratelimit = helpers.try(async (req, res, next) => { +export const ratelimit = helpers.try(async (req, res, next) => { const { uid } = req; if (!meta.config.uploadRateLimitThreshold || (uid && await user.isAdminOrGlobalMod(uid))) { return next(); @@ -21,7 +21,7 @@ exports.ratelimit = helpers.try(async (req, res, next) => { const count = (cache.get(`${req.ip}:uploaded_file_count`) || 0) + req.files.files.length; if (count > meta.config.uploadRateLimitThreshold) { - return next(new Error(['[[error:upload-ratelimit-reached]]'])); + return next(new Error(['[[error:upload-ratelimit-reached]]'] as any)); } cache.set(`${req.ip}:uploaded_file_count`, count); next(); diff --git a/src/middleware/user.ts b/src/middleware/user.ts index c3871bd023..f0e51a25cd 100644 --- a/src/middleware/user.ts +++ b/src/middleware/user.ts @@ -1,17 +1,16 @@ 'use strict'; -const winston = require('winston'); -const passport = require('passport'); -const nconf = require('nconf'); -const path = require('path'); -const util = require('util'); - -const user = require('../user'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const helpers = require('./helpers'); -const auth = require('../routes/authentication'); -const writeRouter = require('../routes/write'); +import winston from 'winston'; +import passport from 'passport'; +import nconf from 'nconf'; +import path from 'path'; +import util from 'util'; +import user from '../user'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import helpers from './helpers'; +import auth from '../routes/authentication'; +import writeRouter from '../routes/write'; const controllers = { helpers: require('../controllers/helpers'), @@ -31,7 +30,7 @@ const passportAuthenticateAsync = function (req, res) { }); }; -module.exports = function (middleware) { +export default function (middleware) { async function authenticate(req, res) { async function finishLogin(req, user) { const loginAsync = util.promisify(req.login).bind(req); @@ -50,7 +49,7 @@ module.exports = function (middleware) { if (req.loggedIn) { return true; } else if (req.headers.hasOwnProperty('authorization')) { - const user = await passportAuthenticateAsync(req, res); + const user: any = await passportAuthenticateAsync(req, res); if (!user) { return true; } if (user.hasOwnProperty('uid')) { diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index a620defa3e..c17a7c0b8e 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -1,13 +1,12 @@ 'use strict'; -const validator = require('validator'); -const winston = require('winston'); +import validator from 'validator'; +import winston from 'winston'; +import plugins from '../plugins'; +import db from '../database'; +import pubsub from '../pubsub'; -const plugins = require('../plugins'); -const db = require('../database'); -const pubsub = require('../pubsub'); - -const admin = module.exports; +const admin = {} as any; let cache = null; pubsub.on('admin:navigation:save', () => { @@ -69,7 +68,7 @@ admin.get = async function () { if (item.hasOwnProperty('groups')) { try { item.groups = JSON.parse(item.groups); - } catch (err) { + } catch (err: any) { winston.error(err.stack); item.groups = []; } @@ -101,4 +100,7 @@ async function getAvailable() { return navItems; } -require('../promisify')(admin); +import promisify from '../promisify'; +promisify(admin); + +export default admin; diff --git a/src/navigation/index.ts b/src/navigation/index.ts index 1867c3396e..852b42f3e0 100644 --- a/src/navigation/index.ts +++ b/src/navigation/index.ts @@ -1,11 +1,11 @@ 'use strict'; -const nconf = require('nconf'); -const validator = require('validator'); -const admin = require('./admin'); -const groups = require('../groups'); +import nconf from 'nconf'; +import validator from 'validator'; +import admin from './admin'; +import groups from '../groups'; -const navigation = module.exports; +const navigation = {} as any; const relative_path = nconf.get('relative_path'); @@ -31,4 +31,7 @@ navigation.get = async function (uid) { return data.filter((navItem, i) => pass[i]); }; -require('../promisify')(navigation); +import promisify from '../promisify'; +promisify(navigation); + +export default navigation; \ No newline at end of file diff --git a/src/notifications.ts b/src/notifications.ts index b484129d5c..beae5639b7 100644 --- a/src/notifications.ts +++ b/src/notifications.ts @@ -1,22 +1,26 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const cron = require('cron').CronJob; -const nconf = require('nconf'); -const _ = require('lodash'); +import async from 'async'; +import winston from 'winston'; +import { CronJob } from 'cron'; +const cron = CronJob; +import nconf from 'nconf'; +import _ from 'lodash'; -const db = require('./database'); -const User = require('./user'); -const posts = require('./posts'); -const groups = require('./groups'); -const meta = require('./meta'); -const batch = require('./batch'); -const plugins = require('./plugins'); -const utils = require('./utils'); -const emailer = require('./emailer'); +import db from './database'; -const Notifications = module.exports; +import User from './user'; +import posts from './posts'; +import groups from './groups'; +import meta from './meta'; +import * as batch from './batch'; +import plugins from './plugins'; +import utils from './utils'; +import emailer from './emailer'; +import websockets from './socket.io'; + + +const Notifications = {} as any; Notifications.baseTypes = [ 'notificationType_upvote', @@ -71,9 +75,7 @@ Notifications.getMultiple = async function (nids) { notifications.forEach((notification, index) => { if (notification) { - if (notification.path && !notification.path.startsWith('http')) { - notification.path = nconf.get('relative_path') + notification.path; - } + if (notification.path && !notification.relative_path + notification.path) notification.datetimeISO = utils.toISOString(notification.datetime); if (notification.bodyLong) { @@ -154,6 +156,7 @@ Notifications.push = async function (notification, uids) { setTimeout(() => { batch.processArray(uids, async (uids) => { await pushToUids(uids, notification); + // @ts-ignore }, { interval: 1000, batch: 500 }, (err) => { if (err) { winston.error(err.stack); @@ -175,7 +178,6 @@ async function pushToUids(uids, notification) { db.sortedSetsRemove(readKeys, notification.nid), ]); await db.sortedSetsRemoveRangeByScore(unreadKeys.concat(readKeys), '-inf', cutoff); - const websockets = require('./socket.io'); if (websockets.server) { uids.forEach((uid) => { websockets.in(`uid_${uid}`).emit('event:new_notification', notification); @@ -246,7 +248,7 @@ async function pushToUids(uids, notification) { await Promise.all([ sendNotification(results.uidsToNotify), sendEmail(results.uidsToEmail), - ]); + ]);module plugins.hooks.fire('action:notification.pushed', { notification: notification, uids: results.uidsToNotify, @@ -285,12 +287,6 @@ Notifications.markRead = async function (nid, uid) { return; } await Notifications.markReadMultiple([nid], uid); -}; - -Notifications.markUnread = async function (nid, uid) { - if (!(parseInt(uid, 10) > 0) || !nid) { - return; - } const notification = await db.getObject(`notifications:${nid}`); if (!notification) { throw new Error('[[error:no-notification]]'); @@ -350,7 +346,7 @@ Notifications.prune = async function () { const read = uids.map(uid => `uid:${uid}:notifications:read`); await db.sortedSetsRemoveRangeByScore(unread.concat(read), '-inf', cutoffTime); }, { batch: 500, interval: 100 }); - } catch (err) { + } catch (err: any) { if (err) { winston.error(`Encountered error pruning notifications\n${err.stack}`); } @@ -444,4 +440,7 @@ Notifications.merge = async function (notifications) { return data && data.notifications; }; -require('./promisify')(Notifications); +import promisify from './promisify'; +promisify(Notifications); + +export default Notifications; \ No newline at end of file diff --git a/src/pagination.ts b/src/pagination.ts index bed225560a..bb2e8d6cf0 100644 --- a/src/pagination.ts +++ b/src/pagination.ts @@ -1,9 +1,9 @@ 'use strict'; -const qs = require('querystring'); -const _ = require('lodash'); +import qs from 'querystring'; +import _ from 'lodash'; -const pagination = module.exports; +const pagination = {} as any; pagination.create = function (currentPage, pageCount, queryObj) { if (pageCount <= 1) { @@ -40,7 +40,7 @@ pagination.create = function (currentPage, pageCount, queryObj) { delete queryObj._; - const pages = pagesToShow.map((page) => { + const pages: any[] = pagesToShow.map((page) => { queryObj.page = page; return { page: page, active: page === currentPage, qs: qs.stringify(queryObj) }; }); @@ -53,7 +53,7 @@ pagination.create = function (currentPage, pageCount, queryObj) { } } - const data = { rel: [], pages: pages, currentPage: currentPage, pageCount: pageCount }; + const data = { rel: [], pages: pages, currentPage: currentPage, pageCount: pageCount } as any; queryObj.page = previous; data.prev = { page: previous, active: currentPage > 1, qs: qs.stringify(queryObj) }; queryObj.page = next; @@ -79,3 +79,5 @@ pagination.create = function (currentPage, pageCount, queryObj) { } return data; }; + +export default pagination; \ No newline at end of file diff --git a/src/password.ts b/src/password.ts index d1b6fc2df5..5e7b9e72f6 100644 --- a/src/password.ts +++ b/src/password.ts @@ -1,17 +1,17 @@ 'use strict'; -const path = require('path'); -const crypto = require('crypto'); -const util = require('util'); +import path from 'path'; +import crypto from 'crypto'; +import util from 'util'; -const bcrypt = require('bcryptjs'); +import bcrypt from 'bcryptjs'; -const fork = require('./meta/debugFork'); +import fork from './meta/debugFork'; function forkChild(message, callback) { const child = fork(path.join(__dirname, 'password')); - child.on('message', (msg) => { + child.on('message', (msg: any) => { callback(msg.err ? new Error(msg.err) : null, msg.result); }); child.on('error', (err) => { @@ -24,12 +24,12 @@ function forkChild(message, callback) { const forkChildAsync = util.promisify(forkChild); -exports.hash = async function (rounds, password) { +export const hash = async function (rounds, password) { password = crypto.createHash('sha512').update(password).digest('hex'); return await forkChildAsync({ type: 'hash', rounds: rounds, password: password }); }; -exports.compare = async function (password, hash, shaWrapped) { +export const compareFn = async function (password, hash, shaWrapped) { const fakeHash = await getFakeHash(); if (shaWrapped) { @@ -44,12 +44,12 @@ async function getFakeHash() { if (fakeHashCache) { return fakeHashCache; } - fakeHashCache = await exports.hash(12, Math.random().toString()); + fakeHashCache = await hash(12, Math.random().toString()); return fakeHashCache; } // child process -process.on('message', (msg) => { +(process as any).on('message', (msg) => { if (msg.type === 'hash') { tryMethod(hashPassword, msg); } else if (msg.type === 'compare') { @@ -60,11 +60,11 @@ process.on('message', (msg) => { async function tryMethod(method, msg) { try { const result = await method(msg); - process.send({ result: result }); - } catch (err) { - process.send({ err: err.message }); + (process as any).send({ result: result }); + } catch (err: any) { + (process as any).send({ err: err.message }); } finally { - process.disconnect(); + (process as any).disconnect(); } } @@ -78,4 +78,5 @@ async function compare(msg) { return await bcrypt.compare(String(msg.password || ''), String(msg.hash || '')); } -require('./promisify')(exports); +import promisify from './promisify'; +promisify(exports); diff --git a/src/plugins/data.ts b/src/plugins/data.ts index ba6e319e78..b3d00dc3bd 100644 --- a/src/plugins/data.ts +++ b/src/plugins/data.ts @@ -1,16 +1,15 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const winston = require('winston'); -const _ = require('lodash'); -const nconf = require('nconf'); +import fs from 'fs'; +import path from 'path'; +import winston from 'winston'; +import _ from 'lodash'; +import nconf from 'nconf'; +import db from '../database'; +import file from '../file'; +import { paths } from '../constants'; -const db = require('../database'); -const file = require('../file'); -const { paths } = require('../constants'); - -const Data = module.exports; +const Data = {} as any; const basePath = path.join(__dirname, '../../'); @@ -57,7 +56,7 @@ Data.loadPluginInfo = async function (pluginPath) { pluginData.repository = packageData.repository; pluginData.nbbpm = packageData.nbbpm; pluginData.path = pluginPath; - } catch (err) { + } catch (err: any) { const pluginDir = path.basename(pluginPath); winston.error(`[plugins/${pluginDir}] Error in plugin.json or package.json!${err.stack}`); @@ -73,8 +72,7 @@ function parseLicense(packageData) { name: licenseData.name, text: licenseData.licenseText, }; - } catch (e) { - // No license matched +} catch (e: any) { // No license matched return null; } } @@ -120,7 +118,7 @@ Data.getStaticDirectories = async function (pluginData) { } staticDirs[`${pluginData.id}/${route}`] = dirPath; - } catch (err) { + } catch (err: any) { if (err.code === 'ENOENT') { winston.warn(`[plugins/${pluginData.id}] Mapped path '${ route} => ${dirPath}' not found.`); @@ -263,3 +261,5 @@ Data.getLanguageData = async function getLanguageData(pluginData) { namespaces: _.uniq(namespaces), }; }; + +export default Data; \ No newline at end of file diff --git a/src/plugins/hooks.ts b/src/plugins/hooks.ts index 58f8c85f96..c04dfc276a 100644 --- a/src/plugins/hooks.ts +++ b/src/plugins/hooks.ts @@ -1,11 +1,13 @@ 'use strict'; -const util = require('util'); -const winston = require('winston'); -const plugins = require('.'); -const utils = require('../utils'); +import util from 'util'; +import winston from 'winston'; +import plugins from '.'; +import utils from '../utils'; +import als from '../als'; -const Hooks = module.exports; + +const Hooks = {} as any; Hooks._deprecated = new Map([ ['filter:email.send', { @@ -115,7 +117,7 @@ Hooks.unregister = function (id, hook, method) { Hooks.fire = async function (hook, params) { const hookList = plugins.loadedHooks[hook]; const hookType = hook.split(':')[0]; - if (global.env === 'development' && hook !== 'action:plugins.firehook' && hook !== 'filter:plugins.firehook') { + if ((global as any).env === 'development' && hook !== 'action:plugins.firehook' && hook !== 'filter:plugins.firehook') { winston.verbose(`[plugins/fireHook] ${hook}`); } @@ -125,7 +127,6 @@ Hooks.fire = async function (hook, params) { } let deleteCaller = false; if (params && typeof params === 'object' && !Array.isArray(params) && !params.hasOwnProperty('caller')) { - const als = require('../als'); params.caller = als.getStore(); deleteCaller = true; } @@ -154,7 +155,7 @@ async function fireFilterHook(hook, hookList, params) { async function fireMethod(hookObj, params) { if (typeof hookObj.method !== 'function') { - if (global.env === 'development') { + if ((global as any).env === 'development') { winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } return params; @@ -203,7 +204,7 @@ async function fireActionHook(hook, hookList, params) { } for (const hookObj of hookList) { if (typeof hookObj.method !== 'function') { - if (global.env === 'development') { + if ((global as any).env === 'development') { winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } } else { @@ -222,7 +223,7 @@ async function fireStaticHook(hook, hookList, params) { for (const hookObj of hookList) { if (typeof hookObj.method !== 'function') { - if (global.env === 'development') { + if ((global as any).env === 'development') { winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } } else { @@ -234,7 +235,7 @@ async function fireStaticHook(hook, hookList, params) { try { // eslint-disable-next-line await timeout(hookFn(params), 5000, 'timeout'); - } catch (err) { + } catch (err: any) { if (err && err.message === 'timeout') { winston.warn(`[plugins] Callback timed out, hook '${hook}' in plugin '${hookObj.id}'`); } else { @@ -265,7 +266,7 @@ async function fireResponseHook(hook, hookList, params) { } for (const hookObj of hookList) { if (typeof hookObj.method !== 'function') { - if (global.env === 'development') { + if ((global as any).env === 'development') { winston.warn(`[plugins] Expected method for hook '${hook}' in plugin '${hookObj.id}' not found, skipping.`); } } else { @@ -278,3 +279,5 @@ async function fireResponseHook(hook, hookList, params) { } } } + +export default Hooks; \ No newline at end of file diff --git a/src/plugins/index.ts b/src/plugins/index.ts index 3587dc091c..4383cf0351 100644 --- a/src/plugins/index.ts +++ b/src/plugins/index.ts @@ -1,29 +1,37 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const winston = require('winston'); -const semver = require('semver'); -const nconf = require('nconf'); -const chalk = require('chalk'); -const request = require('request-promise-native'); +import fs from 'fs'; +import path from 'path'; +import winston from 'winston'; +import semver from 'semver'; +import nconf from 'nconf'; +import chalk from 'chalk'; +import request from 'request-promise-native'; +import user from '../user'; +import posts from '../posts'; +import meta from '../meta'; +import { pluginNamePattern, themeNamePattern, paths } from '../constants'; +import controllers from '../controllers'; -const user = require('../user'); -const posts = require('../posts'); -const meta = require('../meta'); - -const { pluginNamePattern, themeNamePattern, paths } = require('../constants'); let app; let middleware; -const Plugins = module.exports; +const Plugins = {} as any; -require('./install')(Plugins); -require('./load')(Plugins); -require('./usage')(Plugins); -Plugins.data = require('./data'); -Plugins.hooks = require('./hooks'); +import install from './install'; +import load from './load'; +import usage from './usage'; + +install(Plugins); +load(Plugins); +usage(Plugins); + +import data from './data'; +import hooks from './hooks'; + +Plugins.data = data; +Plugins.hooks = hooks; Plugins.getPluginPaths = Plugins.data.getPluginPaths; Plugins.loadPluginInfo = Plugins.data.loadPluginInfo; @@ -50,9 +58,8 @@ Plugins.requireLibrary = function (pluginData) { // Plugins should define their entry point in the standard `main` property of `package.json` try { libraryPath = pluginData.path; - Plugins.libraries[pluginData.id] = require(libraryPath); - } catch (e) { - // DEPRECATED: @1.15.0, remove in version >=1.17 + Plugins.libraries[pluginData.id] = require(libraryPath); +} catch (e: any) { // DEPRECATED: @1.15.0, remove in version >=1.17 // for backwards compatibility // if that fails, fall back to `pluginData.library` if (pluginData.library) { @@ -60,7 +67,7 @@ Plugins.requireLibrary = function (pluginData) { winston.verbose(`[plugins/${pluginData.id}] See https://github.com/NodeBB/NodeBB/issues/8686`); libraryPath = path.join(pluginData.path, pluginData.library); - Plugins.libraries[pluginData.id] = require(libraryPath); + Plugins.libraries[pluginData.id] = require(libraryPath); } else { throw e; } @@ -79,12 +86,12 @@ Plugins.init = async function (nbbApp, nbbMiddleware) { middleware = nbbMiddleware; } - if (global.env === 'development') { + if ((global as any).env === 'development') { winston.verbose('[plugins] Initializing plugins system'); } await Plugins.reload(); - if (global.env === 'development') { + if ((global as any).env === 'development') { winston.info('[plugins] Plugins OK'); } @@ -148,7 +155,6 @@ Plugins.reload = async function () { }; Plugins.reloadRoutes = async function (params) { - const controllers = require('../controllers'); await Plugins.hooks.fire('static:app.load', { app: app, router: params.router, middleware: middleware, controllers: controllers }); winston.verbose('[plugins] All plugins reloaded and rerouted'); }; @@ -175,7 +181,7 @@ Plugins.list = async function (matching) { json: true, }); return await Plugins.normalise(body); - } catch (err) { + } catch (err: any) { winston.error(`Error loading ${url}`, err); return await Plugins.normalise([]); } @@ -234,7 +240,7 @@ Plugins.normalise = async function (apiReturn) { pluginMap[plugin.id].outdated = semver.gt(pluginMap[plugin.id].latest, pluginMap[plugin.id].version); }); - const pluginArray = Object.values(pluginMap); + const pluginArray: any[] = Object.values(pluginMap); pluginArray.sort((a, b) => { if (a.name > b.name) { @@ -266,7 +272,7 @@ Plugins.showInstalled = async function () { pluginData.installed = true; pluginData.error = false; return pluginData; - } catch (err) { + } catch (err: any) { winston.error(err.stack); } } @@ -309,7 +315,7 @@ async function isDirectory(dirPath) { try { const stats = await fs.promises.stat(dirPath); return stats.isDirectory(); - } catch (err) { + } catch (err: any) { if (err.code !== 'ENOENT') { throw err; } @@ -317,4 +323,7 @@ async function isDirectory(dirPath) { } } -require('../promisify')(Plugins); +import promisify from '../promisify'; +promisify(Plugins); + +export default Plugins; diff --git a/src/plugins/install.ts b/src/plugins/install.ts index d358c917a5..d43752e161 100644 --- a/src/plugins/install.ts +++ b/src/plugins/install.ts @@ -1,19 +1,18 @@ 'use strict'; -const winston = require('winston'); -const path = require('path'); -const fs = require('fs').promises; -const nconf = require('nconf'); -const os = require('os'); -const cproc = require('child_process'); -const util = require('util'); -const request = require('request-promise-native'); - -const db = require('../database'); -const meta = require('../meta'); -const pubsub = require('../pubsub'); -const { paths } = require('../constants'); -const pkgInstall = require('../cli/package-install'); +import winston from 'winston'; +import path from 'path'; +import { promises as fs } from 'fs'; +import nconf from 'nconf'; +import os from 'os'; +import cproc from 'child_process'; +import util from 'util'; +import request from 'request-promise-native'; +import db from '../database'; +import meta from '../meta'; +import pubsub from '../pubsub'; +import { paths } from '../constants'; +import pkgInstall from '../cli/package-install'; const packageManager = pkgInstall.getPackageManager(); let packageManagerExecutable = packageManager; @@ -36,11 +35,11 @@ const packageManagerCommands = { }, }; -if (process.platform === 'win32') { +if ((process as any).platform === 'win32') { packageManagerExecutable += '.cmd'; } -module.exports = function (Plugins) { +export default function (Plugins) { if (nconf.get('isPrimary')) { pubsub.on('plugins:toggleInstall', (data) => { if (data.hostname !== os.hostname()) { @@ -151,7 +150,7 @@ module.exports = function (Plugins) { try { const stats = await fs.stat(pluginDir); return stats.isDirectory(); - } catch (err) { + } catch (err: any) { return false; } }; diff --git a/src/plugins/load.ts b/src/plugins/load.ts index d6c0375820..8c1235393d 100644 --- a/src/plugins/load.ts +++ b/src/plugins/load.ts @@ -1,16 +1,15 @@ 'use strict'; -const semver = require('semver'); -const async = require('async'); -const winston = require('winston'); -const nconf = require('nconf'); -const _ = require('lodash'); +import semver from 'semver'; +import async from 'async'; +import winston from 'winston'; +import nconf from 'nconf'; +import _ from 'lodash'; +import meta from '../meta'; +import { themeNamePattern } from '../constants'; -const meta = require('../meta'); -const { themeNamePattern } = require('../constants'); - -module.exports = function (Plugins) { - async function registerPluginAssets(pluginData, fields) { +export default function (Plugins) { + async function registerPluginAssets(pluginData, fields?) { function add(dest, arr) { dest.push(...(arr || [])); } @@ -108,7 +107,7 @@ module.exports = function (Plugins) { let pluginData; try { pluginData = await Plugins.data.loadPluginInfo(pluginPath); - } catch (err) { + } catch (err: any) { if (err.message === '[[error:parse-error]]') { return; } @@ -122,7 +121,7 @@ module.exports = function (Plugins) { try { registerHooks(pluginData); await registerPluginAssets(pluginData); - } catch (err) { + } catch (err: any) { winston.error(err.stack); winston.verbose(`[plugins] Could not load plugin : ${pluginData.id}`); return; @@ -163,7 +162,7 @@ module.exports = function (Plugins) { if (Array.isArray(pluginData.hooks)) { pluginData.hooks.forEach(hook => Plugins.hooks.register(pluginData.id, hook)); } - } catch (err) { + } catch (err: any) { winston.warn(`[plugins] Unable to load library for: ${pluginData.id}`); throw err; } diff --git a/src/plugins/usage.ts b/src/plugins/usage.ts index 43a66f2b54..8d7029acf3 100644 --- a/src/plugins/usage.ts +++ b/src/plugins/usage.ts @@ -1,16 +1,16 @@ 'use strict'; -const nconf = require('nconf'); -const request = require('request'); -const winston = require('winston'); -const crypto = require('crypto'); -const cronJob = require('cron').CronJob; +import nconf from 'nconf'; +import request from 'request'; +import winston from 'winston'; +import crypto from 'crypto'; +import { CronJob } from 'cron'; +const cronJob = CronJob; +//@ts-ignore +import pkg from '../../package.json'; +import meta from '../meta'; -const pkg = require('../../package.json'); - -const meta = require('../meta'); - -module.exports = function (Plugins) { +export default function (Plugins) { Plugins.startJobs = function () { new cronJob('0 0 0 * * *', (() => { Plugins.submitUsageData(); @@ -19,7 +19,7 @@ module.exports = function (Plugins) { Plugins.submitUsageData = function (callback) { callback = callback || function () {}; - if (!meta.config.submitPluginUsage || !Plugins.loadedPlugins.length || global.env !== 'production') { + if (!meta.config.submitPluginUsage || !Plugins.loadedPlugins.length || (global as any).env !== 'production') { return callback(); } diff --git a/src/posts/bookmarks.ts b/src/posts/bookmarks.ts index cab1498f65..db57470e4c 100644 --- a/src/posts/bookmarks.ts +++ b/src/posts/bookmarks.ts @@ -1,9 +1,9 @@ 'use strict'; -const db = require('../database'); -const plugins = require('../plugins'); +import db from '../database'; +import plugins from '../plugins'; -module.exports = function (Posts) { +export default function (Posts) { Posts.bookmark = async function (pid, uid) { return await toggleBookmark('bookmark', pid, uid); }; diff --git a/src/posts/cache.ts b/src/posts/cache.ts index 7f4711d0cd..48577c2304 100644 --- a/src/posts/cache.ts +++ b/src/posts/cache.ts @@ -1,12 +1,13 @@ 'use strict'; -const cacheCreate = require('../cache/lru'); -const meta = require('../meta'); +import cacheCreate from '../cache/lru'; +import Meta from '../meta'; -module.exports = cacheCreate({ +export default cacheCreate({ name: 'post', - maxSize: meta.config.postCacheSize, + //@ts-ignore + maxSize: Meta.config.postCacheSize, sizeCalculation: function (n) { return n.length || 1; }, ttl: 0, - enabled: global.env === 'production', + enabled: (global as any).env === 'production', }); diff --git a/src/posts/category.ts b/src/posts/category.ts index d5f4874cc1..1857108c04 100644 --- a/src/posts/category.ts +++ b/src/posts/category.ts @@ -2,12 +2,11 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import topics from '../topics'; -const db = require('../database'); -const topics = require('../topics'); - -module.exports = function (Posts) { +export default function (Posts) { Posts.getCidByPid = async function (pid) { const tid = await Posts.getPostField(pid, 'tid'); return await topics.getTopicField(tid, 'cid'); @@ -39,3 +38,4 @@ module.exports = function (Posts) { return pids.filter((pid, index) => pid && isMembers[index]); } }; + diff --git a/src/posts/create.ts b/src/posts/create.ts index c95ba3535e..bc8bb98aca 100644 --- a/src/posts/create.ts +++ b/src/posts/create.ts @@ -1,17 +1,16 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import meta from '../meta'; +import db from '../database'; +import plugins from '../plugins'; +import user from '../user'; +import topics from '../topics'; +import categories from '../categories'; +import groups from '../groups'; +import utils from '../utils'; -const meta = require('../meta'); -const db = require('../database'); -const plugins = require('../plugins'); -const user = require('../user'); -const topics = require('../topics'); -const categories = require('../categories'); -const groups = require('../groups'); -const utils = require('../utils'); - -module.exports = function (Posts) { +export default function (Posts) { Posts.create = async function (data) { // This is an internal method, consider using Topics.reply instead const { uid } = data; @@ -35,7 +34,7 @@ module.exports = function (Posts) { tid: tid, content: content, timestamp: timestamp, - }; + } as any; if (data.toPid) { postData.toPid = data.toPid; diff --git a/src/posts/data.ts b/src/posts/data.ts index 3a4d303ff5..25633922ab 100644 --- a/src/posts/data.ts +++ b/src/posts/data.ts @@ -1,8 +1,8 @@ 'use strict'; -const db = require('../database'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import db from '../database'; +import plugins from '../plugins'; +import utils from '../utils'; const intFields = [ 'uid', 'pid', 'tid', 'deleted', 'timestamp', @@ -10,7 +10,7 @@ const intFields = [ 'replies', 'bookmarks', ]; -module.exports = function (Posts) { +export default function (Posts) { Posts.getPostsFields = async function (pids, fields) { if (!Array.isArray(pids) || !pids.length) { return []; diff --git a/src/posts/delete.ts b/src/posts/delete.ts index fb285b5128..7fb1d71d46 100644 --- a/src/posts/delete.ts +++ b/src/posts/delete.ts @@ -1,16 +1,15 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import topics from '../topics'; +import categories from '../categories'; +import user from '../user'; +import notifications from '../notifications'; +import plugins from '../plugins'; +import flags from '../flags'; -const db = require('../database'); -const topics = require('../topics'); -const categories = require('../categories'); -const user = require('../user'); -const notifications = require('../notifications'); -const plugins = require('../plugins'); -const flags = require('../flags'); - -module.exports = function (Posts) { +export default function (Posts) { Posts.delete = async function (pid, uid) { return await deleteOrRestore('delete', pid, uid); }; @@ -105,10 +104,10 @@ module.exports = function (Posts) { }); await db.sortedSetRemoveBulk(bulkRemove); - const incrObjectBulk = [['global', { postCount: -postData.length }]]; + const incrObjectBulk = [['global', { postCount: -postData.length }]] as any[]; const postsByCategory = _.groupBy(postData, p => parseInt(p.cid, 10)); - for (const [cid, posts] of Object.entries(postsByCategory)) { + for (const [cid, posts] of Object.entries(postsByCategory) as any[]) { incrObjectBulk.push([`category:${cid}`, { post_count: -posts.length }]); } @@ -116,7 +115,7 @@ module.exports = function (Posts) { const topicPostCountTasks = []; const topicTasks = []; const zsetIncrBulk = []; - for (const [tid, posts] of Object.entries(postsByTopic)) { + for (const [tid, posts] of Object.entries(postsByTopic) as any[] ) { incrObjectBulk.push([`topic:${tid}`, { postcount: -posts.length }]); if (posts.length && posts[0]) { const topicData = posts[0].topic; @@ -129,7 +128,7 @@ module.exports = function (Posts) { topicTasks.push(topics.updateTeaser(tid)); topicTasks.push(topics.updateLastPostTimeFromLastPid(tid)); const postsByUid = _.groupBy(posts, p => parseInt(p.uid, 10)); - for (const [uid, uidPosts] of Object.entries(postsByUid)) { + for (const [uid, uidPosts] of Object.entries(postsByUid) as any[]) { zsetIncrBulk.push([`tid:${tid}:posters`, -uidPosts.length, uid]); } topicTasks.push(db.sortedSetIncrByBulk(zsetIncrBulk)); diff --git a/src/posts/diffs.ts b/src/posts/diffs.ts index eb687195d3..a5ad72c009 100644 --- a/src/posts/diffs.ts +++ b/src/posts/diffs.ts @@ -1,16 +1,15 @@ 'use strict'; -const validator = require('validator'); -const diff = require('diff'); +import validator from 'validator'; +import diff from 'diff'; +import db from '../database'; +import meta from '../meta'; +import plugins from '../plugins'; +import translator from '../translator'; +import topics from '../topics'; -const db = require('../database'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const translator = require('../translator'); -const topics = require('../topics'); - -module.exports = function (Posts) { - const Diffs = {}; +export default function (Posts) { + const Diffs = {} as any; Posts.diffs = Diffs; Diffs.exists = async function (pid) { if (meta.config.enablePostHistory !== 1) { @@ -43,7 +42,7 @@ module.exports = function (Posts) { const diffData = { uid: uid, pid: pid, - }; + } as any; if (oldContent !== newContent) { diffData.patch = diff.createPatch('', newContent, oldContent); } diff --git a/src/posts/edit.ts b/src/posts/edit.ts index 453a10e9dd..e3e33802d8 100644 --- a/src/posts/edit.ts +++ b/src/posts/edit.ts @@ -1,20 +1,19 @@ 'use strict'; -const validator = require('validator'); -const _ = require('lodash'); +import validator from 'validator'; +import _ from 'lodash'; +import db from '../database'; +import meta from '../meta'; +import topics from '../topics'; +import user from '../user'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import pubsub from '../pubsub'; +import utils from '../utils'; +import slugify from '../slugify'; +import translator from '../translator'; -const db = require('../database'); -const meta = require('../meta'); -const topics = require('../topics'); -const user = require('../user'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const pubsub = require('../pubsub'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const translator = require('../translator'); - -module.exports = function (Posts) { +export default function (Posts) { pubsub.on('post:edit', (pid) => { require('./cache').del(pid); }); @@ -36,7 +35,7 @@ module.exports = function (Posts) { await scheduledTopicCheck(data, topicData); const oldContent = postData.content; // for diffing purposes - const editPostData = getEditPostData(data, topicData, postData); + const editPostData: any = getEditPostData(data, topicData, postData); if (data.handle) { editPostData.handle = data.handle; @@ -125,7 +124,7 @@ module.exports = function (Posts) { uid: postData.uid, mainPid: data.pid, timestamp: rescheduling(data, topicData) ? data.timestamp : topicData.timestamp, - }; + } as any; if (title) { newTopicData.title = title; newTopicData.slug = `${tid}/${slugify(title) || 'topic'}`; @@ -195,7 +194,7 @@ module.exports = function (Posts) { const editPostData = { content: data.content, editor: data.uid, - }; + } as any; // For posts in scheduled topics, if edited before, use edit timestamp editPostData.edited = topicData.scheduled ? (postData.edited || postData.timestamp) + 1 : Date.now(); diff --git a/src/posts/index.ts b/src/posts/index.ts index 196ebfc65a..77891ed914 100644 --- a/src/posts/index.ts +++ b/src/posts/index.ts @@ -1,31 +1,46 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import utils from '../utils'; +import user from '../user'; +import privileges from '../privileges'; +import plugins from '../plugins'; -const db = require('../database'); -const utils = require('../utils'); -const user = require('../user'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); +const Posts = {} as any; -const Posts = module.exports; +import data from './data'; +import create from './create'; +import deletePost from './delete'; +import edit from './edit'; +import parse from './parse'; +import topics from './topics'; +import category from './category'; +import summary from './summary'; +import recent from './recent'; +import tools from './tools'; +import bookmarks from './bookmarks'; +import queue from './queue'; +import diffs from './diffs'; +import uploads from './uploads'; +import votes from './votes'; -require('./data')(Posts); -require('./create')(Posts); -require('./delete')(Posts); -require('./edit')(Posts); -require('./parse')(Posts); -require('./user')(Posts); -require('./topics')(Posts); -require('./category')(Posts); -require('./summary')(Posts); -require('./recent')(Posts); -require('./tools')(Posts); -require('./votes')(Posts); -require('./bookmarks')(Posts); -require('./queue')(Posts); -require('./diffs')(Posts); -require('./uploads')(Posts); +data(Posts); +create(Posts); +deletePost(Posts); +edit(Posts); +parse(Posts); +user(Posts); +topics(Posts); +category(Posts); +summary(Posts); +recent(Posts); +tools(Posts); +votes(Posts); +bookmarks(Posts); +queue(Posts); +diffs(Posts); +uploads(Posts); Posts.exists = async function (pids) { return await db.exists( @@ -101,4 +116,7 @@ Posts.modifyPostByPrivilege = function (post, privileges) { } }; -require('../promisify')(Posts); +import promisify from '../promisify'; +promisify(Posts); + +export default Posts; \ No newline at end of file diff --git a/src/posts/parse.ts b/src/posts/parse.ts index 944c1c2125..1b2ba6e2ff 100644 --- a/src/posts/parse.ts +++ b/src/posts/parse.ts @@ -1,15 +1,21 @@ 'use strict'; -const nconf = require('nconf'); -const url = require('url'); -const winston = require('winston'); -const sanitize = require('sanitize-html'); -const _ = require('lodash'); +import nconf from 'nconf'; +import url from 'url'; +import winston from 'winston'; +import sanitize from 'sanitize-html'; +import _ from 'lodash'; +import meta from '../meta'; +console.log('M 1', meta); +import plugins from '../plugins'; +console.log('P 2'); +import translator from '../translator'; +console.log('T 3'); +import utils from '../utils'; +console.log('U 4'); +import cache from './cache'; +console.log('C 5'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const translator = require('../translator'); -const utils = require('../utils'); let sanitizeConfig = { allowedTags: sanitize.defaults.allowedTags.concat([ @@ -36,7 +42,7 @@ let sanitizeConfig = { }, }; -module.exports = function (Posts) { +export default function (Posts) { Posts.urlRegex = { regex: /href="([^"]+)"/g, length: 6, @@ -52,7 +58,6 @@ module.exports = function (Posts) { return postData; } postData.content = String(postData.content || ''); - const cache = require('./cache'); const pid = String(postData.pid); const cachedContent = cache.get(pid); if (postData.pid && cachedContent !== undefined) { @@ -98,7 +103,7 @@ module.exports = function (Posts) { absolute + content.slice(current.index + regex.length + current[1].length); } - } catch (err) { + } catch (err: any) { winston.verbose(err.messsage); } } diff --git a/src/posts/queue.ts b/src/posts/queue.ts index 0b334742b1..88bdea789c 100644 --- a/src/posts/queue.ts +++ b/src/posts/queue.ts @@ -1,24 +1,25 @@ 'use strict'; -const _ = require('lodash'); -const validator = require('validator'); -const nconf = require('nconf'); +import _ from 'lodash'; +import validator from 'validator'; +import nconf from 'nconf'; +import db from '../database'; +import user from '../user'; +import meta from '../meta'; +import groups from '../groups'; +import topics from '../topics'; +import categories from '../categories'; +import notifications from '../notifications'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import utils from '../utils'; +import cache from '../cache'; +import socketHelpers from '../socket.io/helpers'; +import { app } from '../webserver'; -const db = require('../database'); -const user = require('../user'); -const meta = require('../meta'); -const groups = require('../groups'); -const topics = require('../topics'); -const categories = require('../categories'); -const notifications = require('../notifications'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const cache = require('../cache'); -const socketHelpers = require('../socket.io/helpers'); -module.exports = function (Posts) { - Posts.getQueuedPosts = async (filter = {}, options = {}) => { +export default function (Posts) { + Posts.getQueuedPosts = async (filter = {} as any, options = {} as any) => { options = { metadata: true, ...options }; // defaults let postData = _.cloneDeep(cache.get('post-queue')); if (!postData) { @@ -187,12 +188,12 @@ module.exports = function (Posts) { userData.url = `${url}/uid/${userData.uid}`; } - const topic = { cid: cid, title: data.title, tid: data.tid }; + const topic = { cid: cid, title: data.title, tid: data.tid } as any; if (type === 'reply') { topic.title = await topics.getTopicField(data.tid, 'title'); topic.url = `${url}/topic/${data.tid}`; } - const { app } = require('../webserver'); + //@ts-ignore return await app.renderAsync('emails/partials/post-queue-body', { content: content, category: category, diff --git a/src/posts/recent.ts b/src/posts/recent.ts index 2ad84b0c7c..4fb0b3f85a 100644 --- a/src/posts/recent.ts +++ b/src/posts/recent.ts @@ -1,12 +1,11 @@ 'use strict'; -const _ = require('lodash'); - -const db = require('../database'); -const privileges = require('../privileges'); +import _ from 'lodash'; +import db from '../database'; +import privileges from '../privileges'; -module.exports = function (Posts) { +export default function (Posts) { const terms = { day: 86400000, week: 604800000, diff --git a/src/posts/summary.ts b/src/posts/summary.ts index 82468a17d5..1dfd3f0fd1 100644 --- a/src/posts/summary.ts +++ b/src/posts/summary.ts @@ -1,16 +1,15 @@ 'use strict'; -const validator = require('validator'); -const _ = require('lodash'); +import validator from 'validator'; +import _ from 'lodash'; +import topics from '../topics'; +import user from '../user'; +import plugins from '../plugins'; +import categories from '../categories'; +import utils from '../utils'; -const topics = require('../topics'); -const user = require('../user'); -const plugins = require('../plugins'); -const categories = require('../categories'); -const utils = require('../utils'); - -module.exports = function (Posts) { +export default function (Posts) { Posts.getPostSummaryByPids = async function (pids, uid, options) { if (!Array.isArray(pids) || !pids.length) { return []; diff --git a/src/posts/tools.ts b/src/posts/tools.ts index daa5bde189..4db4fc3d40 100644 --- a/src/posts/tools.ts +++ b/src/posts/tools.ts @@ -1,8 +1,8 @@ 'use strict'; -const privileges = require('../privileges'); +import privileges from '../privileges'; -module.exports = function (Posts) { +export default function (Posts) { Posts.tools = {}; Posts.tools.delete = async function (uid, pid) { diff --git a/src/posts/topics.ts b/src/posts/topics.ts index 9c17d33ba9..7393e4000a 100644 --- a/src/posts/topics.ts +++ b/src/posts/topics.ts @@ -1,11 +1,11 @@ 'use strict'; -const topics = require('../topics'); -const user = require('../user'); -const utils = require('../utils'); +import topics from '../topics'; +import user from '../user'; +import utils from '../utils'; -module.exports = function (Posts) { +export default function (Posts) { Posts.getPostsFromSet = async function (set, start, stop, uid, reverse) { const pids = await Posts.getPidsFromSet(set, start, stop, reverse); const posts = await Posts.getPostsByPids(pids, uid); diff --git a/src/posts/uploads.ts b/src/posts/uploads.ts index 27a6c10168..da22c4e872 100644 --- a/src/posts/uploads.ts +++ b/src/posts/uploads.ts @@ -1,23 +1,23 @@ 'use strict'; -const nconf = require('nconf'); -const fs = require('fs').promises; -const crypto = require('crypto'); -const path = require('path'); -const winston = require('winston'); -const mime = require('mime'); -const validator = require('validator'); -const cronJob = require('cron').CronJob; -const chalk = require('chalk'); +import nconf from 'nconf'; +import { promises as fs } from 'fs'; +import crypto from 'crypto'; +import path from 'path'; +import winston from 'winston'; +import mime from 'mime'; +import validator from 'validator'; +import { CronJob } from 'cron'; +const cronJob = CronJob; +import chalk from 'chalk'; +import db from '../database'; +import image from '../image'; +import user from '../user'; +import topics from '../topics'; +import file from '../file'; +import meta from '../meta'; -const db = require('../database'); -const image = require('../image'); -const user = require('../user'); -const topics = require('../topics'); -const file = require('../file'); -const meta = require('../meta'); - -module.exports = function (Posts) { +export default function (Posts) { Posts.uploads = {}; const md5 = filename => crypto.createHash('md5').update(filename).digest('hex'); @@ -37,7 +37,7 @@ module.exports = function (Posts) { if (orphans.length) { winston.info(`[posts/uploads] Deleting ${orphans.length} orphaned uploads...`); orphans.forEach((relPath) => { - process.stdout.write(`${chalk.red(' - ')} ${relPath}`); + (process as any).stdout.write(`${chalk.red(' - ')} ${relPath}`); }); } }, null, true); @@ -221,7 +221,7 @@ module.exports = function (Posts) { width: size.width, height: size.height, }); - } catch (err) { + } catch (err: any) { winston.error(`[posts/uploads] Error while saving post upload sizes (${fileName}): ${err.message}`); } })); diff --git a/src/posts/user.ts b/src/posts/user.ts index 960e4960a6..9aa46b5f56 100644 --- a/src/posts/user.ts +++ b/src/posts/user.ts @@ -1,18 +1,17 @@ 'use strict'; -const async = require('async'); -const validator = require('validator'); -const _ = require('lodash'); +import async from 'async'; +import validator from 'validator'; +import _ from 'lodash'; +import db from '../database'; +import user from '../user'; +import topics from '../topics'; +import groups from '../groups'; +import meta from '../meta'; +import plugins from '../plugins'; +import privileges from '../privileges'; -const db = require('../database'); -const user = require('../user'); -const topics = require('../topics'); -const groups = require('../groups'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); - -module.exports = function (Posts) { +export default function (Posts) { Posts.getUserInfoForPosts = async function (uids, uid) { const [userData, userSettings, signatureUids] = await Promise.all([ getUserData(uids, uid), diff --git a/src/posts/votes.ts b/src/posts/votes.ts index dfdfad2899..d459255526 100644 --- a/src/posts/votes.ts +++ b/src/posts/votes.ts @@ -1,15 +1,15 @@ 'use strict'; -const meta = require('../meta'); -const db = require('../database'); -const flags = require('../flags'); -const user = require('../user'); -const topics = require('../topics'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const translator = require('../translator'); +import meta from '../meta'; +import db from '../database'; +import flags from '../flags'; +import user from '../user'; +import topics from '../topics'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import translator from '../translator'; -module.exports = function (Posts) { +export default function (Posts) { const votesInProgress = {}; Posts.upvote = async function (pid, uid) { diff --git a/src/prestart.ts b/src/prestart.ts index 1af2d5ce68..1fe89092b0 100644 --- a/src/prestart.ts +++ b/src/prestart.ts @@ -1,15 +1,16 @@ 'use strict'; -const nconf = require('nconf'); -const url = require('url'); -const winston = require('winston'); -const path = require('path'); -const chalk = require('chalk'); +import nconf from 'nconf'; +import url from 'url'; +import winston from 'winston'; +import path from 'path'; +import chalk from 'chalk'; +import semver from 'semver'; +//@ts-ignore +import pkg from '../../install/package.json'; +import { paths } from './constants'; -const pkg = require('../package.json'); -const { paths } = require('./constants'); - -function setupWinston() { +export function setupWinston() { if (!winston.format) { return; } @@ -24,7 +25,7 @@ function setupWinston() { formats.push(winston.format.json()); } else { const timestampFormat = winston.format((info) => { - const dateString = `${new Date().toISOString()} [${nconf.get('port')}/${global.process.pid}]`; + const dateString = `${new Date().toISOString()} [${nconf.get('port')}/${(global as any).process.pid}]`; info.level = `${dateString} - ${info.level}`; return info; }); @@ -34,7 +35,7 @@ function setupWinston() { } winston.configure({ - level: nconf.get('log-level') || (process.env.NODE_ENV === 'production' ? 'info' : 'verbose'), + level: nconf.get('log-level') || ((process as any).env.NODE_ENV === 'production' ? 'info' : 'verbose'), format: winston.format.combine.apply(null, formats), transports: [ new winston.transports.Console({ @@ -44,11 +45,10 @@ function setupWinston() { }); } -function loadConfig(configFile) { +export function loadConfig(configFile) { nconf.file({ file: configFile, }); - nconf.defaults({ base_dir: paths.baseDir, themes_path: paths.nodeModules, @@ -85,7 +85,6 @@ function loadConfig(configFile) { if (!nconf.get('sessionKey')) { nconf.set('sessionKey', 'express.sid'); } - if (nconf.get('url')) { nconf.set('url', nconf.get('url').replace(/\/$/, '')); nconf.set('url_parsed', url.parse(nconf.get('url'))); @@ -108,10 +107,9 @@ function loadConfig(configFile) { } } -function versionCheck() { - const version = process.version.slice(1); +export function versionCheck() { + const version = (process as any).version.slice(1); const range = pkg.engines.node; - const semver = require('semver'); const compatible = semver.satisfies(version, range); if (!compatible) { @@ -120,6 +118,5 @@ function versionCheck() { } } -exports.setupWinston = setupWinston; -exports.loadConfig = loadConfig; -exports.versionCheck = versionCheck; + + diff --git a/src/privileges/admin.ts b/src/privileges/admin.ts index 5a733d30f4..14a86a14b3 100644 --- a/src/privileges/admin.ts +++ b/src/privileges/admin.ts @@ -1,15 +1,14 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import user from '../user'; +import groups from '../groups'; +import helpers from './helpers'; +import plugins from '../plugins'; +import utils from '../utils'; -const user = require('../user'); -const groups = require('../groups'); -const helpers = require('./helpers'); -const plugins = require('../plugins'); -const utils = require('../utils'); - -const privsAdmin = module.exports; +const privsAdmin = {} as any; /** * Looking to add a new admin privilege via plugin/theme? Attach a hook to @@ -147,7 +146,7 @@ privsAdmin.list = async function (uid) { const keys = { users: userPrivilegeList, groups: groupPrivilegeList, - }; + } as any; const payload = await utils.promiseParallel({ labels, @@ -210,3 +209,5 @@ privsAdmin.groupPrivileges = async function (groupName) { const groupPrivilegeList = await privsAdmin.getGroupPrivilegeList(); return await helpers.userOrGroupPrivileges(0, groupName, groupPrivilegeList); }; + +export default privsAdmin; \ No newline at end of file diff --git a/src/privileges/categories.ts b/src/privileges/categories.ts index c95f52acc8..006de47d1f 100644 --- a/src/privileges/categories.ts +++ b/src/privileges/categories.ts @@ -1,16 +1,15 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import categories from '../categories'; +import user from '../user'; +import groups from '../groups'; +import helpers from './helpers'; +import plugins from '../plugins'; +import utils from '../utils'; -const categories = require('../categories'); -const user = require('../user'); -const groups = require('../groups'); -const helpers = require('./helpers'); -const plugins = require('../plugins'); -const utils = require('../utils'); - -const privsCategories = module.exports; +const privsCategories = {} as any; /** * Looking to add a new category privilege via plugin/theme? Attach a hook to @@ -55,7 +54,7 @@ privsCategories.init = async () => { // Method used in admin/category controller to show all users/groups with privs in that given cid privsCategories.list = async function (cid) { - let labels = Array.from(_privilegeMap.values()).map(data => data.label); + let labels: any = Array.from(_privilegeMap.values()).map(data => data.label); labels = await utils.promiseParallel({ users: plugins.hooks.fire('filter:privileges.list_human', labels.slice()), groups: plugins.hooks.fire('filter:privileges.groups.list_human', labels.slice()), @@ -224,3 +223,5 @@ privsCategories.groupPrivileges = async function (cid, groupName) { const groupPrivilegeList = await privsCategories.getGroupPrivilegeList(); return await helpers.userOrGroupPrivileges(cid, groupName, groupPrivilegeList); }; + +export default privsCategories; \ No newline at end of file diff --git a/src/privileges/global.ts b/src/privileges/global.ts index 472448d4c4..184c21d35e 100644 --- a/src/privileges/global.ts +++ b/src/privileges/global.ts @@ -1,15 +1,23 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +console.log(0); +import user from '../user'; +console.log('U 1'); +import groups from '../groups'; +console.log('G 2'); +import helpers from './helpers'; +console.log('H 3'); +import plugins from '../plugins'; +console.log('P 4'); +import utils from '../utils'; +console.log('U 5'); +import privCategories from './categories'; +console.log('P 6'); -const user = require('../user'); -const groups = require('../groups'); -const helpers = require('./helpers'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const privsGlobal = module.exports; +const privsGlobal = {} as any; /** * Looking to add a new global privilege via plugin/theme? Attach a hook to @@ -105,7 +113,6 @@ privsGlobal.canGroup = async function (privilege, groupName) { }; privsGlobal.filterUids = async function (privilege, uids) { - const privCategories = require('./categories'); return await privCategories.filterUids(privilege, 0, uids); }; @@ -134,3 +141,5 @@ privsGlobal.groupPrivileges = async function (groupName) { const groupPrivilegeList = await privsGlobal.getGroupPrivilegeList(); return await helpers.userOrGroupPrivileges(0, groupName, groupPrivilegeList); }; + +export default privsGlobal; \ No newline at end of file diff --git a/src/privileges/helpers.ts b/src/privileges/helpers.ts index e6a0266f67..f71453f137 100644 --- a/src/privileges/helpers.ts +++ b/src/privileges/helpers.ts @@ -1,15 +1,14 @@ 'use strict'; -const _ = require('lodash'); -const validator = require('validator'); +import _ from 'lodash'; +import validator from 'validator'; +import groups from '../groups'; +import user from '../user'; +import plugins from '../plugins'; +import translator from '../translator'; -const groups = require('../groups'); -const user = require('../user'); -const plugins = require('../plugins'); -const translator = require('../translator'); - -const helpers = module.exports; +const helpers = {} as any; const uidToSystemGroup = { 0: 'guests', @@ -189,4 +188,7 @@ helpers.userOrGroupPrivileges = async function (cid, uidOrGroup, privilegeList) return _.zipObject(privilegeList, isMembers); }; -require('../promisify')(helpers); +import promisify from '../promisify'; +promisify(helpers); + +export default helpers; diff --git a/src/privileges/index.ts b/src/privileges/index.ts index e399e25c9d..ae8199bd32 100644 --- a/src/privileges/index.ts +++ b/src/privileges/index.ts @@ -1,12 +1,23 @@ 'use strict'; -const privileges = module.exports; -privileges.global = require('./global'); -privileges.admin = require('./admin'); -privileges.categories = require('./categories'); -privileges.topics = require('./topics'); -privileges.posts = require('./posts'); -privileges.users = require('./users'); +const privileges = {} as any; + +import global from './global'; +import admin from './admin'; +import categories from './categories'; +import topics from './topics'; +import posts from './posts'; +import users from './users'; + + +Object.assign(privileges, { + global, + admin, + categories, + topics, + posts, + users, +}); privileges.init = async () => { await privileges.global.init(); @@ -14,4 +25,7 @@ privileges.init = async () => { await privileges.categories.init(); }; -require('../promisify')(privileges); +import promisify from '../promisify'; +promisify(privileges); + +export default privileges; diff --git a/src/privileges/posts.ts b/src/privileges/posts.ts index 8b32065df6..5d1f24deee 100644 --- a/src/privileges/posts.ts +++ b/src/privileges/posts.ts @@ -1,19 +1,18 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import meta from '../meta'; +import posts from '../posts'; +import topics from '../topics'; +import user from '../user'; +import helpers from './helpers'; +import plugins from '../plugins'; +import utils from '../utils'; +import privsCategories from './categories'; +import privsTopics from './topics'; -const meta = require('../meta'); -const posts = require('../posts'); -const topics = require('../topics'); -const user = require('../user'); -const helpers = require('./helpers'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const privsCategories = require('./categories'); -const privsTopics = require('./topics'); - -const privsPosts = module.exports; +const privsPosts = {} as any; privsPosts.get = async function (pids, uid) { if (!Array.isArray(pids) || !pids.length) { @@ -34,7 +33,7 @@ privsPosts.get = async function (pids, uid) { }); const isModerator = _.zipObject(uniqueCids, results.isModerator); - const privData = {}; + const privData = {} as any; privData['topics:read'] = _.zipObject(uniqueCids, results['topics:read']); privData.read = _.zipObject(uniqueCids, results.read); privData['posts:edit'] = _.zipObject(uniqueCids, results['posts:edit']); @@ -232,3 +231,5 @@ async function isAdminOrMod(pid, uid) { const cid = await posts.getCidByPid(pid); return await privsCategories.isAdminOrMod(cid, uid); } + +export default privsPosts; \ No newline at end of file diff --git a/src/privileges/topics.ts b/src/privileges/topics.ts index cabbf3dfed..ec60691ab6 100644 --- a/src/privileges/topics.ts +++ b/src/privileges/topics.ts @@ -1,17 +1,16 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import meta from '../meta'; +import topics from '../topics'; +import user from '../user'; +import helpers from './helpers'; +import categories from '../categories'; +import plugins from '../plugins'; +import privsCategories from './categories'; -const meta = require('../meta'); -const topics = require('../topics'); -const user = require('../user'); -const helpers = require('./helpers'); -const categories = require('../categories'); -const plugins = require('../plugins'); -const privsCategories = require('./categories'); - -const privsTopics = module.exports; +const privsTopics = {} as any; privsTopics.get = async function (tid, uid) { uid = parseInt(uid, 10); @@ -174,7 +173,7 @@ privsTopics.isAdminOrMod = async function (tid, uid) { return await privsCategories.isAdminOrMod(cid, uid); }; -privsTopics.canViewDeletedScheduled = function (topic, privileges = {}, viewDeleted = false, viewScheduled = false) { +privsTopics.canViewDeletedScheduled = function (topic, privileges = {} as any, viewDeleted = false, viewScheduled = false) { if (!topic) { return false; } @@ -190,3 +189,5 @@ privsTopics.canViewDeletedScheduled = function (topic, privileges = {}, viewDele return true; }; + +export default privsTopics; \ No newline at end of file diff --git a/src/privileges/users.ts b/src/privileges/users.ts index ac3c0ca1c7..4fc16e7401 100644 --- a/src/privileges/users.ts +++ b/src/privileges/users.ts @@ -1,15 +1,15 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import user from '../user'; +import meta from '../meta'; +import groups from '../groups'; +import plugins from '../plugins'; +import helpers from './helpers'; +import privsGlobal from './global'; -const user = require('../user'); -const meta = require('../meta'); -const groups = require('../groups'); -const plugins = require('../plugins'); -const helpers = require('./helpers'); - -const privsUsers = module.exports; +const privsUsers = {} as any; privsUsers.isAdministrator = async function (uid) { return await isGroupMember(uid, 'administrators'); @@ -95,7 +95,6 @@ privsUsers.canEdit = async function (callerUid, uid) { }; privsUsers.canBanUser = async function (callerUid, uid) { - const privsGlobal = require('./global'); const [canBan, isTargetAdmin] = await Promise.all([ privsGlobal.can('ban', callerUid), privsUsers.isAdministrator(uid), @@ -110,7 +109,6 @@ privsUsers.canBanUser = async function (callerUid, uid) { }; privsUsers.canMuteUser = async function (callerUid, uid) { - const privsGlobal = require('./global'); const [canMute, isTargetAdmin] = await Promise.all([ privsGlobal.can('mute', callerUid), privsUsers.isAdministrator(uid), @@ -145,10 +143,12 @@ privsUsers.hasMutePrivilege = async uid => await hasGlobalPrivilege('mute', uid) privsUsers.hasInvitePrivilege = async uid => await hasGlobalPrivilege('invite', uid); async function hasGlobalPrivilege(privilege, uid) { - const privsGlobal = require('./global'); + const privilegeName = privilege.split('-').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join(''); let payload = { uid }; payload[`can${privilegeName}`] = await privsGlobal.can(privilege, uid); payload = await plugins.hooks.fire(`filter:user.has${privilegeName}Privilege`, payload); return payload[`can${privilegeName}`]; } + +export default privsUsers; \ No newline at end of file diff --git a/src/promisify.ts b/src/promisify.ts index da6aad1fd2..896d34d68e 100644 --- a/src/promisify.ts +++ b/src/promisify.ts @@ -1,15 +1,15 @@ 'use strict'; -const util = require('util'); +import util from 'util'; -module.exports = function (theModule, ignoreKeys) { +export default function (theModule, ignoreKeys?) { ignoreKeys = ignoreKeys || []; function isCallbackedFunction(func) { if (typeof func !== 'function') { return false; } const str = func.toString().split('\n')[0]; - return str.includes('callback)'); + return str.includes('callback'); } function isAsyncFunction(fn) { diff --git a/src/pubsub.ts b/src/pubsub.ts index f5c057c9e0..ba94352173 100644 --- a/src/pubsub.ts +++ b/src/pubsub.ts @@ -1,7 +1,7 @@ 'use strict'; -const EventEmitter = require('events'); -const nconf = require('nconf'); +import EventEmitter from 'events'; +import nconf from 'nconf'; let real; let noCluster; @@ -28,17 +28,17 @@ function get() { return real; } singleHost = new EventEmitter(); - if (!process.send) { + if (!(process as any).send) { singleHost.publish = singleHost.emit.bind(singleHost); } else { singleHost.publish = function (event, data) { - process.send({ + (process as any).send({ action: 'pubsub', event: event, data: data, }); }; - process.on('message', (message) => { + (process as any).on('message', (message: any) => { if (message && typeof message === 'object' && message.action === 'pubsub') { singleHost.emit(message.event, message.data); } @@ -46,7 +46,7 @@ function get() { } pubsub = singleHost; } else if (nconf.get('redis')) { - pubsub = require('./database/redis/pubsub'); + pubsub = require('./database/redis/pubsub').default; } else { throw new Error('[[error:redis-required-for-pubsub]]'); } @@ -55,8 +55,8 @@ function get() { return pubsub; } -module.exports = { - publish: function (event, data) { +export default { + publish: function (event, data?) { get().publish(event, data); }, on: function (event, callback) { diff --git a/src/rewards/admin.ts b/src/rewards/admin.ts index edd3202e26..ffa086697f 100644 --- a/src/rewards/admin.ts +++ b/src/rewards/admin.ts @@ -1,10 +1,10 @@ 'use strict'; -const plugins = require('../plugins'); -const db = require('../database'); -const utils = require('../utils'); +import plugins from '../plugins'; +import db from '../database'; +import utils from '../utils'; -const rewards = module.exports; +const rewards = {} as any; rewards.save = async function (data) { async function save(data) { @@ -78,4 +78,7 @@ async function getActiveRewards() { return rewardData.filter(Boolean); } -require('../promisify')(rewards); +import promisify from '../promisify'; +promisify(rewards); + +export default rewards; diff --git a/src/rewards/index.ts b/src/rewards/index.ts index b4c9f8418f..561442a72b 100644 --- a/src/rewards/index.ts +++ b/src/rewards/index.ts @@ -1,11 +1,10 @@ 'use strict'; -const util = require('util'); +import util from 'util'; +import db from '../database'; +import plugins from '../plugins'; -const db = require('../database'); -const plugins = require('../plugins'); - -const rewards = module.exports; +const rewards = {} as any; rewards.checkConditionAndRewardUser = async function (params) { const { uid, condition, method } = params; @@ -77,4 +76,7 @@ async function giveRewards(uid, rewards) { } } -require('../promisify')(rewards); +import promisify from '../promisify'; +promisify(rewards); + +export default rewards; diff --git a/src/routes/admin.ts b/src/routes/admin.ts index aac0e5dfb0..a2bad55a83 100644 --- a/src/routes/admin.ts +++ b/src/routes/admin.ts @@ -1,8 +1,10 @@ 'use strict'; -const helpers = require('./helpers'); +import helpers from './helpers'; +import multipart from 'connect-multiparty'; -module.exports = function (app, name, middleware, controllers) { + +export default function (app, name, middleware, controllers) { const middlewares = [middleware.pluginHooks]; helpers.setupAdminPageRoute(app, `/${name}`, middlewares, controllers.admin.routeIndex); @@ -68,7 +70,6 @@ function apiRoutes(router, name, middleware, controllers) { router.get(`/api/${name}/analytics`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.dashboard.getAnalytics)); router.get(`/api/${name}/advanced/cache/dump`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.cache.dump)); - const multipart = require('connect-multiparty'); const multipartMiddleware = multipart(); const middlewares = [multipartMiddleware, middleware.validateFiles, middleware.applyCSRF, middleware.ensureLoggedIn]; diff --git a/src/routes/api.ts b/src/routes/api.ts index 7f4afdc801..ae7c10e340 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -1,11 +1,12 @@ 'use strict'; -const express = require('express'); +import express from 'express'; +import uploadsController from '../controllers/uploads'; +import helpers from './helpers'; +import multipart from 'connect-multiparty'; -const uploadsController = require('../controllers/uploads'); -const helpers = require('./helpers'); -module.exports = function (app, middleware, controllers) { +export default function (app, middleware, controllers) { const middlewares = [middleware.authenticateRequest]; const router = express.Router(); app.use('/api', router); @@ -23,7 +24,6 @@ module.exports = function (app, middleware, controllers) { router.get('/topic/teaser/:topic_id', [...middlewares], helpers.tryRoute(controllers.topics.teaser)); router.get('/topic/pagination/:topic_id', [...middlewares], helpers.tryRoute(controllers.topics.pagination)); - const multipart = require('connect-multiparty'); const multipartMiddleware = multipart(); const postMiddlewares = [ middleware.maintenanceMode, diff --git a/src/routes/authentication.ts b/src/routes/authentication.ts index a26a44a5e7..5415a22a99 100644 --- a/src/routes/authentication.ts +++ b/src/routes/authentication.ts @@ -1,19 +1,20 @@ 'use strict'; -const async = require('async'); -const passport = require('passport'); -const passportLocal = require('passport-local').Strategy; -const BearerStrategy = require('passport-http-bearer').Strategy; -const winston = require('winston'); +import async from 'async'; +import passport from 'passport'; +import { Strategy as passportLocal } from 'passport-local'; +import { Strategy as BearerStrategy } from 'passport-http-bearer'; +import winston from 'winston'; +import meta from '../meta'; +import controllers from '../controllers'; +import helpers from '../controllers/helpers'; +import plugins from '../plugins'; +import multipart from 'connect-multiparty'; -const meta = require('../meta'); -const controllers = require('../controllers'); -const helpers = require('../controllers/helpers'); -const plugins = require('../plugins'); let loginStrategies = []; -const Auth = module.exports; +const Auth = {} as any; Auth.initialize = function (app, middleware) { app.use(passport.initialize()); @@ -81,7 +82,7 @@ Auth.reloadRoutes = async function (params) { // Additional logins via SSO plugins try { loginStrategies = await plugins.hooks.fire('filter:auth.init', loginStrategies); - } catch (err) { + } catch (err: any) { winston.error(`[authentication] ${err.stack}`); } loginStrategies = loginStrategies || []; @@ -91,7 +92,7 @@ Auth.reloadRoutes = async function (params) { let opts = { scope: strategy.scope, prompt: strategy.prompt || undefined, - }; + } as any; if (strategy.checkState !== false) { req.session.ssoState = req.csrfToken && req.csrfToken(); @@ -151,7 +152,6 @@ Auth.reloadRoutes = async function (params) { }); }); - const multipart = require('connect-multiparty'); const multipartMiddleware = multipart(); const middlewares = [multipartMiddleware, Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist]; @@ -171,3 +171,5 @@ passport.deserializeUser((uid, done) => { uid: uid, }); }); + +export default Auth; diff --git a/src/routes/debug.ts b/src/routes/debug.ts index b4ad76721f..d383f5a851 100644 --- a/src/routes/debug.ts +++ b/src/routes/debug.ts @@ -1,16 +1,15 @@ 'use strict'; -const express = require('express'); -const nconf = require('nconf'); +import express from 'express'; +import nconf from 'nconf'; +import { promises as fs } from 'fs'; +import path from 'path'; -const fs = require('fs').promises; -const path = require('path'); - -module.exports = function (app) { +export default function (app) { const router = express.Router(); router.get('/test', async (req, res) => { - res.redirect(404); + res.redirect(404 as any); }); // Redoc diff --git a/src/routes/feeds.ts b/src/routes/feeds.ts index fbd8de7072..2e6dc22e1f 100644 --- a/src/routes/feeds.ts +++ b/src/routes/feeds.ts @@ -1,19 +1,19 @@ 'use strict'; -const rss = require('rss'); -const nconf = require('nconf'); -const validator = require('validator'); - -const posts = require('../posts'); -const topics = require('../topics'); -const user = require('../user'); -const categories = require('../categories'); -const meta = require('../meta'); -const helpers = require('../controllers/helpers'); -const privileges = require('../privileges'); -const db = require('../database'); -const utils = require('../utils'); -const controllers404 = require('../controllers/404'); +import rss from 'rss'; +import nconf from 'nconf'; +import validator from 'validator'; +import posts from '../posts'; +import topics from '../topics'; +import user from '../user'; +import categories from '../categories'; +import meta from '../meta'; +import helpers from '../controllers/helpers'; +import privileges from '../privileges'; +import db from '../database'; +import utils from '../utils'; +//@ts-ignore +import controllers404 from '../controllers/404'; const terms = { daily: 'day', @@ -22,7 +22,7 @@ const terms = { alltime: 'alltime', }; -module.exports = function (app, middleware) { +export default function (app, middleware) { app.get('/topic/:topic_id.rss', middleware.maintenanceMode, generateForTopic); app.get('/category/:category_id.rss', middleware.maintenanceMode, generateForCategory); app.get('/topics.rss', middleware.maintenanceMode, generateForTopics); @@ -225,7 +225,7 @@ async function generateSorted(options, req, res, next) { stop: 19, term: term, sort: options.sort, - }; + } as any; const { cid } = req.query; if (cid) { @@ -247,7 +247,7 @@ async function generateSorted(options, req, res, next) { sendFeed(feed, res); } -async function sendTopicsFeed(options, set, res, timestampField) { +async function sendTopicsFeed(options, set, res, timestampField?) { const start = options.hasOwnProperty('start') ? options.start : 0; const stop = options.hasOwnProperty('stop') ? options.stop : 19; const topicData = await topics.getTopicsFromSet(set, options.uid, start, stop); @@ -273,7 +273,7 @@ async function generateTopicsFeed(feedOptions, feedTopics, timestampField) { title: utils.stripHTMLTags(topicData.title, utils.tags), url: `${nconf.get('url')}/topic/${topicData.slug}`, date: new Date(topicData[timestampField]).toUTCString(), - }; + } as any; if (topicData.deleted) { return; diff --git a/src/routes/helpers.ts b/src/routes/helpers.ts index 6d0976f8d5..5b0a403549 100644 --- a/src/routes/helpers.ts +++ b/src/routes/helpers.ts @@ -1,9 +1,9 @@ 'use strict'; -const helpers = module.exports; -const winston = require('winston'); -const middleware = require('../middleware'); -const controllerHelpers = require('../controllers/helpers'); +const helpers = {} as any; +import winston from 'winston'; +import middleware from '../middleware'; +import controllerHelpers from '../controllers/helpers'; // router, name, middleware(deprecated), middlewares(optional), controller helpers.setupPageRoute = function (...args) { @@ -71,7 +71,7 @@ helpers.tryRoute = function (controller, handler) { return async function (req, res, next) { try { await controller(req, res, next); - } catch (err) { + } catch (err: any) { if (handler) { return handler(err, res); } @@ -82,3 +82,5 @@ helpers.tryRoute = function (controller, handler) { } return controller; }; + +export default helpers; \ No newline at end of file diff --git a/src/routes/index.ts b/src/routes/index.ts index f3861aa1bf..6c1b93be57 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1,19 +1,17 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); -const path = require('path'); -const express = require('express'); -const chalk = require('chalk'); - -const meta = require('../meta'); -const controllers = require('../controllers'); -const controllerHelpers = require('../controllers/helpers'); -const plugins = require('../plugins'); - -const authRoutes = require('./authentication'); -const writeRoutes = require('./write'); -const helpers = require('./helpers'); +import nconf from 'nconf'; +import winston from 'winston'; +import path from 'path'; +import express from 'express'; +import chalk from 'chalk'; +import meta from '../meta'; +import controllers from '../controllers'; +import controllerHelpers from '../controllers/helpers'; +import plugins from '../plugins'; +import authRoutes from './authentication'; +import writeRoutes from './write'; +import helpers from './helpers'; const { setupPageRoute } = helpers; @@ -23,7 +21,7 @@ const _mounts = { api: require('./api'), admin: require('./admin'), feed: require('./feeds'), -}; +} as any; _mounts.main = (app, middleware, controllers) => { const loginRegisterMiddleware = [middleware.redirectToAccountIfLoggedIn]; @@ -101,8 +99,8 @@ _mounts.groups = (app, name, middleware, controllers) => { setupPageRoute(app, `/${name}/:slug/members`, middlewares, controllers.groups.members); }; -module.exports = async function (app, middleware) { - const router = express.Router(); +export default async function (app, middleware) { + const router: any = express.Router(); router.render = function (...args) { app.render(...args); }; @@ -163,7 +161,7 @@ function addCoreRoutes(app, router, middleware, mounts) { const relativePath = nconf.get('relative_path'); app.use(relativePath || '/', router); - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { require('./debug')(app, middleware, controllers); } diff --git a/src/routes/meta.ts b/src/routes/meta.ts index 9c633bb125..4608e5e5b9 100644 --- a/src/routes/meta.ts +++ b/src/routes/meta.ts @@ -1,9 +1,9 @@ 'use strict'; -const path = require('path'); -const nconf = require('nconf'); +import path from 'path'; +import nconf from 'nconf'; -module.exports = function (app, middleware, controllers) { +export default function (app, middleware, controllers) { app.get('/sitemap.xml', controllers.sitemap.render); app.get('/sitemap/pages.xml', controllers.sitemap.getPages); app.get('/sitemap/categories.xml', controllers.sitemap.getCategories); diff --git a/src/routes/user.ts b/src/routes/user.ts index b6fd28d21d..0e56f52abc 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -1,10 +1,10 @@ 'use strict'; -const helpers = require('./helpers'); +import helpers from './helpers'; const { setupPageRoute } = helpers; -module.exports = function (app, name, middleware, controllers) { +export default function (app, name, middleware, controllers) { const middlewares = [middleware.exposeUid, middleware.canViewUsers]; const accountMiddlewares = [ middleware.exposeUid, diff --git a/src/routes/write/admin.ts b/src/routes/write/admin.ts index 0cda6327fb..813f756523 100644 --- a/src/routes/write/admin.ts +++ b/src/routes/write/admin.ts @@ -1,13 +1,15 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; const { setupApiRoute } = routeHelpers; -module.exports = function () { +const router = Router(); + +export default function () { const middlewares = [middleware.ensureLoggedIn, middleware.admin.checkPrivileges]; setupApiRoute(router, 'put', '/settings/:setting', [...middlewares, middleware.checkRequired.bind(null, ['value'])], controllers.write.admin.updateSetting); diff --git a/src/routes/write/categories.ts b/src/routes/write/categories.ts index ed3ffd2dce..550ce71b82 100644 --- a/src/routes/write/categories.ts +++ b/src/routes/write/categories.ts @@ -1,13 +1,14 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; const { setupApiRoute } = routeHelpers; +const router = Router(); -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn]; setupApiRoute(router, 'post', '/', [...middlewares, middleware.checkRequired.bind(null, ['name'])], controllers.write.categories.create); diff --git a/src/routes/write/chats.ts b/src/routes/write/chats.ts index 1e5d870ca5..14f458ed84 100644 --- a/src/routes/write/chats.ts +++ b/src/routes/write/chats.ts @@ -1,13 +1,15 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; + +const router = Router(); const { setupApiRoute } = routeHelpers; -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn, middleware.canChat]; setupApiRoute(router, 'get', '/', [...middlewares], controllers.write.chats.list); diff --git a/src/routes/write/files.ts b/src/routes/write/files.ts index 873144870c..cde77b2822 100644 --- a/src/routes/write/files.ts +++ b/src/routes/write/files.ts @@ -1,13 +1,15 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; + +const router = Router(); const { setupApiRoute } = routeHelpers; -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn, middleware.admin.checkPrivileges]; // setupApiRoute(router, 'put', '/', [ diff --git a/src/routes/write/flags.ts b/src/routes/write/flags.ts index 6e9c8e6623..2d82ce3eee 100644 --- a/src/routes/write/flags.ts +++ b/src/routes/write/flags.ts @@ -1,13 +1,14 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; const { setupApiRoute } = routeHelpers; +const router = Router(); -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn]; setupApiRoute(router, 'post', '/', [...middlewares], controllers.write.flags.create); diff --git a/src/routes/write/groups.ts b/src/routes/write/groups.ts index 0245690fcb..f01eaaca1e 100644 --- a/src/routes/write/groups.ts +++ b/src/routes/write/groups.ts @@ -1,13 +1,14 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; +const router = Router(); const { setupApiRoute } = routeHelpers; -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn]; setupApiRoute(router, 'post', '/', [...middlewares, middleware.checkRequired.bind(null, ['name'])], controllers.write.groups.create); diff --git a/src/routes/write/index.ts b/src/routes/write/index.ts index 04d3207e05..ea556b00e2 100644 --- a/src/routes/write/index.ts +++ b/src/routes/write/index.ts @@ -1,13 +1,16 @@ 'use strict'; -const winston = require('winston'); -const meta = require('../../meta'); -const plugins = require('../../plugins'); -const middleware = require('../../middleware'); -const writeControllers = require('../../controllers/write'); -const helpers = require('../../controllers/helpers'); +import winston from 'winston'; +import meta from '../../meta'; +import plugins from '../../plugins'; +import middleware from '../../middleware'; +import writeControllers from '../../controllers/write'; +import helpers from '../../controllers/helpers'; +import { Router } from 'express'; -const Write = module.exports; +const pluginRouter = Router; + +const Write = {} as any; Write.reload = async (params) => { const { router } = params; @@ -51,12 +54,12 @@ Write.reload = async (params) => { * below hook. The hooks added to the passed-in router will be mounted to * `/api/v3/plugins`. */ - const pluginRouter = require('express').Router(); await plugins.hooks.fire('static:api.routes', { router: pluginRouter, middleware, helpers, }); + //@ts-ignore winston.info(`[api] Adding ${pluginRouter.stack.length} route(s) to \`api/v3/plugins\``); router.use('/api/v3/plugins', pluginRouter); @@ -71,3 +74,5 @@ Write.cleanup = (req) => { req.session.destroy(); } }; + +export default Write; \ No newline at end of file diff --git a/src/routes/write/posts.ts b/src/routes/write/posts.ts index b6831890a0..17366de0bc 100644 --- a/src/routes/write/posts.ts +++ b/src/routes/write/posts.ts @@ -1,13 +1,15 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; + +const router = Router(); const { setupApiRoute } = routeHelpers; -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn]; setupApiRoute(router, 'get', '/:pid', [], controllers.write.posts.get); diff --git a/src/routes/write/topics.ts b/src/routes/write/topics.ts index 3a0c7c306e..8c7f6ed805 100644 --- a/src/routes/write/topics.ts +++ b/src/routes/write/topics.ts @@ -1,16 +1,18 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; +import multipart from 'connect-multiparty'; + +const router = Router(); const { setupApiRoute } = routeHelpers; -module.exports = function () { +export default function () { const middlewares = [middleware.ensureLoggedIn]; - const multipart = require('connect-multiparty'); const multipartMiddleware = multipart(); setupApiRoute(router, 'post', '/', [middleware.checkRequired.bind(null, ['cid', 'title', 'content'])], controllers.write.topics.create); diff --git a/src/routes/write/users.ts b/src/routes/write/users.ts index 980eccc8a2..c8cf2c2863 100644 --- a/src/routes/write/users.ts +++ b/src/routes/write/users.ts @@ -1,12 +1,14 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; const { setupApiRoute } = routeHelpers; +const router = Router(); + // eslint-disable-next-line no-unused-vars function guestRoutes() { // like registration, login... @@ -59,7 +61,7 @@ function authenticatedRoutes() { router.all('/+bySlug/:userslug*?', [], controllers.write.users.redirectBySlug); } -module.exports = function () { +export default function () { authenticatedRoutes(); return router; diff --git a/src/routes/write/utilities.ts b/src/routes/write/utilities.ts index 7f442bbfa2..a391c62f27 100644 --- a/src/routes/write/utilities.ts +++ b/src/routes/write/utilities.ts @@ -1,13 +1,14 @@ 'use strict'; -const router = require('express').Router(); -const middleware = require('../../middleware'); -const controllers = require('../../controllers'); -const routeHelpers = require('../helpers'); +import { Router } from 'express'; +import middleware from '../../middleware'; +import controllers from '../../controllers'; +import routeHelpers from '../helpers'; const { setupApiRoute } = routeHelpers; +const router = Router(); -module.exports = function () { +export default function () { // The "ping" routes are mounted at root level, but for organizational purposes, the controllers are in `utilities.js` setupApiRoute(router, 'post', '/login', [middleware.checkRequired.bind(null, ['username', 'password'])], controllers.write.utilities.login); diff --git a/src/search.ts b/src/search.ts index cbd4e4f40c..6f150e0721 100644 --- a/src/search.ts +++ b/src/search.ts @@ -1,20 +1,21 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; -const db = require('./database'); -const posts = require('./posts'); -const topics = require('./topics'); -const categories = require('./categories'); -const user = require('./user'); -const plugins = require('./plugins'); -const privileges = require('./privileges'); -const utils = require('./utils'); +import db from './database'; -const search = module.exports; +import posts from './posts'; +import topics from './topics'; +import categories from './categories'; +import user from './user'; +import plugins from './plugins'; +import privileges from './privileges'; +import utils from './utils'; + +const search = {} as any; search.search = async function (data) { - const start = process.hrtime(); + const start = (process as any).hrtime(); data.sortBy = data.sortBy || 'relevance'; let result; @@ -34,7 +35,7 @@ search.search = async function (data) { throw new Error('[[error:unknown-search-filter]]'); } - result.time = (process.elapsedTimeSince(start) / 1000).toFixed(2); + result.time = ((process as any).elapsedTimeSince(start) / 1000).toFixed(2); return result; }; @@ -313,4 +314,7 @@ async function getSearchUids(data) { return await user.getUidsByUsernames(Array.isArray(data.postedBy) ? data.postedBy : [data.postedBy]); } -require('./promisify')(search); +import promisify from './promisify'; +promisify(search); + +export default search; \ No newline at end of file diff --git a/src/settings.ts b/src/settings.ts index 87508b1dcb..5feb230559 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,7 +1,7 @@ 'use strict'; -const meta = require('./meta'); -const pubsub = require('./pubsub'); +import meta from './meta'; +import pubsub from './pubsub'; function expandObjBy(obj1, obj2) { let changed = false; @@ -72,7 +72,7 @@ function Settings(hash, version, defCfg, callback, forceUpdate, reset) { pubsub.on(`action:settings.set.${hash}`, (data) => { try { self.cfg._ = JSON.parse(data._); - } catch (err) {} + } catch (err: any) {} }); } @@ -237,4 +237,4 @@ Settings.prototype.checkStructure = function (callback, force) { return this; }; -module.exports = Settings; +export default Settings; diff --git a/src/sitemap.ts b/src/sitemap.ts index 353ed23f43..f4ab224e7c 100644 --- a/src/sitemap.ts +++ b/src/sitemap.ts @@ -1,17 +1,18 @@ 'use strict'; -const { SitemapStream, streamToPromise } = require('sitemap'); -const nconf = require('nconf'); +import { SitemapStream, streamToPromise } from 'sitemap'; +import nconf from 'nconf'; -const db = require('./database'); -const categories = require('./categories'); -const topics = require('./topics'); -const privileges = require('./privileges'); -const meta = require('./meta'); -const plugins = require('./plugins'); -const utils = require('./utils'); +import db from './database'; -const sitemap = module.exports; +import categories from './categories'; +import topics from './topics'; +import privileges from './privileges'; +import meta from './meta'; +import plugins from './plugins'; +import utils from './utils'; + +const sitemap = {} as any; sitemap.maps = { topics: [], }; @@ -21,7 +22,7 @@ sitemap.render = async function () { const returnData = { url: nconf.get('url'), topics: [], - }; + } as any; const [topicCount, categories, pages] = await Promise.all([ db.getObjectField('global', 'topicCount'), getSitemapCategories(), @@ -177,4 +178,7 @@ sitemap.clearCache = function () { }); }; -require('./promisify')(sitemap); +import promisify from './promisify'; +promisify(sitemap); + +export default sitemap; \ No newline at end of file diff --git a/src/slugify.ts b/src/slugify.ts index 6ef70c1b87..9fc5d94a0e 100644 --- a/src/slugify.ts +++ b/src/slugify.ts @@ -1,3 +1,5 @@ 'use strict'; +//@ts-ignore +import slugify from '../../public/src/modules/slugify'; -module.exports = require('../public/src/modules/slugify'); +export default slugify; diff --git a/src/social.ts b/src/social.ts index c95f2cc3ac..557b70866c 100644 --- a/src/social.ts +++ b/src/social.ts @@ -1,10 +1,11 @@ 'use strict'; -const _ = require('lodash'); -const plugins = require('./plugins'); -const db = require('./database'); +import _ from 'lodash'; +import plugins from './plugins'; +import db from './database'; -const social = module.exports; + +const social = {} as any; social.postSharing = null; @@ -27,7 +28,7 @@ social.getPostSharing = async function () { ]; networks = await plugins.hooks.fire('filter:social.posts', networks); const activated = await db.getSetMembers('social:posts.activated'); - networks.forEach((network) => { + networks.forEach((network: any) => { network.activated = activated.includes(network.id); }); @@ -49,4 +50,7 @@ social.setActivePostSharingNetworks = async function (networkIDs) { await db.setAdd('social:posts.activated', networkIDs); }; -require('./promisify')(social); +import promisify from './promisify'; +promisify(social); + +export default social; \ No newline at end of file diff --git a/src/socket.io/admin.ts b/src/socket.io/admin.ts index 1621ef71a0..88c814b58d 100644 --- a/src/socket.io/admin.ts +++ b/src/socket.io/admin.ts @@ -1,36 +1,58 @@ 'use strict'; -const winston = require('winston'); +import winston from 'winston'; +import meta from '../meta'; +import user from '../user'; +import events from '../events'; +import db from '../database'; +import privileges from '../privileges'; +import websockets from './index'; +import index from './index'; +import search from '../admin/search'; -const meta = require('../meta'); -const user = require('../user'); -const events = require('../events'); -const db = require('../database'); -const privileges = require('../privileges'); -const websockets = require('./index'); -const index = require('./index'); -const getAdminSearchDict = require('../admin/search').getDictionary; +const getAdminSearchDict = search.getLatestVersionDictionary; -const SocketAdmin = module.exports; -SocketAdmin.user = require('./admin/user'); -SocketAdmin.categories = require('./admin/categories'); -SocketAdmin.settings = require('./admin/settings'); -SocketAdmin.tags = require('./admin/tags'); -SocketAdmin.rewards = require('./admin/rewards'); -SocketAdmin.navigation = require('./admin/navigation'); -SocketAdmin.rooms = require('./admin/rooms'); -SocketAdmin.social = require('./admin/social'); -SocketAdmin.themes = require('./admin/themes'); -SocketAdmin.plugins = require('./admin/plugins'); -SocketAdmin.widgets = require('./admin/widgets'); -SocketAdmin.config = require('./admin/config'); -SocketAdmin.settings = require('./admin/settings'); -SocketAdmin.email = require('./admin/email'); -SocketAdmin.analytics = require('./admin/analytics'); -SocketAdmin.logs = require('./admin/logs'); -SocketAdmin.errors = require('./admin/errors'); -SocketAdmin.digest = require('./admin/digest'); -SocketAdmin.cache = require('./admin/cache'); +const SocketAdmin = {} as any; + +import adminUser from './admin/user'; +import categories from './admin/categories'; +import adminSettings from './admin/settings'; +import tags from './admin/tags'; +import rewards from './admin/rewards'; +import navigation from './admin/navigation'; +import rooms from './admin/rooms'; +import social from './admin/social'; +import plugins from './admin/plugins'; +import widgets from './admin/widgets'; +import config from './admin/config'; +import settings from './admin/settings'; +import email from './admin/email'; +import analytics from './admin/analytics'; +import logs from './admin/logs'; +import errors from './admin/errors'; +import digest from './admin/digest'; +import cache from './admin/cache'; + +Object.assign(SocketAdmin, { + user, + categories, + settings, + tags, + rewards, + navigation, + rooms, + social, + plugins, + widgets, + config, + adminSettings, + email, + analytics, + logs, + errors, + digest, + cache, +}); SocketAdmin.before = async function (socket, method) { const isAdmin = await user.isAdministrator(socket.uid); @@ -118,4 +140,7 @@ SocketAdmin.getServerTime = function (socket, data, callback) { }); }; -require('../promisify')(SocketAdmin); +import promisify from '../promisify'; +promisify(SocketAdmin); + +export default SocketAdmin; diff --git a/src/socket.io/admin/analytics.ts b/src/socket.io/admin/analytics.ts index bc084b14f5..936d3b54e1 100644 --- a/src/socket.io/admin/analytics.ts +++ b/src/socket.io/admin/analytics.ts @@ -1,9 +1,9 @@ 'use strict'; -const analytics = require('../../analytics'); -const utils = require('../../utils'); +import analytics from '../../analytics'; +import utils from '../../utils'; -const Analytics = module.exports; +const Analytics = {} as any; Analytics.get = async function (socket, data) { if (!data || !data.graph || !data.units) { @@ -34,3 +34,5 @@ Analytics.get = async function (socket, data) { return result; } }; + +export default Analytics; \ No newline at end of file diff --git a/src/socket.io/admin/cache.ts b/src/socket.io/admin/cache.ts index 1d382720f5..d7d512b060 100644 --- a/src/socket.io/admin/cache.ts +++ b/src/socket.io/admin/cache.ts @@ -1,9 +1,9 @@ 'use strict'; -const SocketCache = module.exports; +const SocketCache = {} as any; -const db = require('../../database'); -const plugins = require('../../plugins'); +import db from '../../database'; +import plugins from '../../plugins'; SocketCache.clear = async function (socket, data) { let caches = { @@ -32,3 +32,5 @@ SocketCache.toggle = async function (socket, data) { } caches[data.name].enabled = data.enabled; }; + +export default SocketCache; \ No newline at end of file diff --git a/src/socket.io/admin/categories.ts b/src/socket.io/admin/categories.ts index 53c541598d..ad3ad53e65 100644 --- a/src/socket.io/admin/categories.ts +++ b/src/socket.io/admin/categories.ts @@ -1,9 +1,9 @@ 'use strict'; -const categories = require('../../categories'); +import categories from '../../categories'; -const Categories = module.exports; +const Categories = {} as any; Categories.getNames = async function () { return await categories.getAllCategoryFields(['cid', 'name']); @@ -42,3 +42,5 @@ Categories.copyPrivilegesToAllCategories = async function (socket, data) { await categories.copyPrivilegesFrom(data.cid, toCid, data.group, data.filter); } }; + +export default Categories; \ No newline at end of file diff --git a/src/socket.io/admin/config.ts b/src/socket.io/admin/config.ts index 7864dc2d54..67f2000938 100644 --- a/src/socket.io/admin/config.ts +++ b/src/socket.io/admin/config.ts @@ -1,12 +1,12 @@ 'use strict'; -const meta = require('../../meta'); -const plugins = require('../../plugins'); -const logger = require('../../logger'); -const events = require('../../events'); -const index = require('../index'); +import meta from '../../meta'; +import plugins from '../../plugins'; +import logger from '../../logger'; +import events from '../../events'; +import index from '../index'; -const Config = module.exports; +const Config = {} as any; Config.set = async function (socket, data) { if (!data) { @@ -22,7 +22,7 @@ Config.setMultiple = async function (socket, data) { throw new Error('[[error:invalid-data]]'); } - const changes = {}; + const changes = {} as any; const newData = meta.configs.serialize(data); const oldData = meta.configs.serialize(meta.config); Object.keys(newData).forEach((key) => { @@ -48,3 +48,5 @@ Config.setMultiple = async function (socket, data) { Config.remove = async function (socket, key) { await meta.configs.remove(key); }; + +export default Config; \ No newline at end of file diff --git a/src/socket.io/admin/digest.ts b/src/socket.io/admin/digest.ts index 491b639d93..307164d6c7 100644 --- a/src/socket.io/admin/digest.ts +++ b/src/socket.io/admin/digest.ts @@ -1,9 +1,9 @@ 'use strict'; -const meta = require('../../meta'); -const userDigest = require('../../user/digest'); +import meta from '../../meta'; +import userDigest from '../../user/digest'; -const Digest = module.exports; +const Digest = {} as any; Digest.resend = async (socket, data) => { const { uid } = data; @@ -22,3 +22,5 @@ Digest.resend = async (socket, data) => { await userDigest.execute({ interval: interval }); } }; + +export default Digest; \ No newline at end of file diff --git a/src/socket.io/admin/email.ts b/src/socket.io/admin/email.ts index 2068cb1f7f..49e479a10d 100644 --- a/src/socket.io/admin/email.ts +++ b/src/socket.io/admin/email.ts @@ -1,13 +1,13 @@ 'use strict'; -const meta = require('../../meta'); -const userDigest = require('../../user/digest'); -const userEmail = require('../../user/email'); -const notifications = require('../../notifications'); -const emailer = require('../../emailer'); -const utils = require('../../utils'); +import meta from '../../meta'; +import userDigest from '../../user/digest'; +import userEmail from '../../user/email'; +import notifications from '../../notifications'; +import emailer from '../../emailer'; +import utils from '../../utils'; -const Email = module.exports; +const Email = {} as any; Email.test = async function (socket, data) { const payload = { @@ -66,3 +66,5 @@ Email.test = async function (socket, data) { break; } }; + +export default Email; \ No newline at end of file diff --git a/src/socket.io/admin/errors.ts b/src/socket.io/admin/errors.ts index 9cd3bddcc7..0a0af51cb4 100644 --- a/src/socket.io/admin/errors.ts +++ b/src/socket.io/admin/errors.ts @@ -1,9 +1,11 @@ 'use strict'; -const meta = require('../../meta'); +import meta from '../../meta'; -const Errors = module.exports; +const Errors = {} as any; Errors.clear = async function () { await meta.errors.clear(); }; + +export default Errors; diff --git a/src/socket.io/admin/logs.ts b/src/socket.io/admin/logs.ts index 1062934bf7..81992dd361 100644 --- a/src/socket.io/admin/logs.ts +++ b/src/socket.io/admin/logs.ts @@ -1,8 +1,8 @@ 'use strict'; -const meta = require('../../meta'); +import meta from '../../meta'; -const Logs = module.exports; +const Logs = {} as any; Logs.get = async function () { return await meta.logs.get(); @@ -11,3 +11,5 @@ Logs.get = async function () { Logs.clear = async function () { await meta.logs.clear(); }; + +export default Logs; diff --git a/src/socket.io/admin/navigation.ts b/src/socket.io/admin/navigation.ts index a4dc1d1a35..1283b5c8db 100644 --- a/src/socket.io/admin/navigation.ts +++ b/src/socket.io/admin/navigation.ts @@ -1,9 +1,11 @@ 'use strict'; -const navigationAdmin = require('../../navigation/admin'); +import navigationAdmin from '../../navigation/admin'; -const SocketNavigation = module.exports; +const SocketNavigation = {} as any; SocketNavigation.save = async function (socket, data) { await navigationAdmin.save(data); }; + +export default SocketNavigation; diff --git a/src/socket.io/admin/plugins.ts b/src/socket.io/admin/plugins.ts index 46d77c9c1a..8a74aca909 100644 --- a/src/socket.io/admin/plugins.ts +++ b/src/socket.io/admin/plugins.ts @@ -1,12 +1,11 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import plugins from '../../plugins'; +import events from '../../events'; +import db from '../../database'; -const plugins = require('../../plugins'); -const events = require('../../events'); -const db = require('../../database'); - -const Plugins = module.exports; +const Plugins = {} as any; Plugins.toggleActive = async function (socket, plugin_id) { require('../../posts/cache').reset(); @@ -47,3 +46,5 @@ Plugins.orderActivePlugins = async function (socket, data) { Plugins.upgrade = async function (socket, data) { return await plugins.upgrade(data.id, data.version); }; + +export default Plugins; \ No newline at end of file diff --git a/src/socket.io/admin/rewards.ts b/src/socket.io/admin/rewards.ts index 278d5e6e0f..5e73afdc8b 100644 --- a/src/socket.io/admin/rewards.ts +++ b/src/socket.io/admin/rewards.ts @@ -1,8 +1,8 @@ 'use strict'; -const rewardsAdmin = require('../../rewards/admin'); +import rewardsAdmin from '../../rewards/admin'; -const SocketRewards = module.exports; +const SocketRewards = {} as any; SocketRewards.save = async function (socket, data) { return await rewardsAdmin.save(data); @@ -11,3 +11,5 @@ SocketRewards.save = async function (socket, data) { SocketRewards.delete = async function (socket, data) { await rewardsAdmin.delete(data); }; + +export default SocketRewards; \ No newline at end of file diff --git a/src/socket.io/admin/rooms.ts b/src/socket.io/admin/rooms.ts index 4aafe9fbf6..f84abe57ab 100644 --- a/src/socket.io/admin/rooms.ts +++ b/src/socket.io/admin/rooms.ts @@ -1,16 +1,17 @@ 'use strict'; -const os = require('os'); -const nconf = require('nconf'); +import os from 'os'; +import nconf from 'nconf'; +import topics from '../../topics'; +import pubsub from '../../pubsub'; +import utils from '../../utils'; +import Sockets from '../index'; -const topics = require('../../topics'); -const pubsub = require('../../pubsub'); -const utils = require('../../utils'); -const stats = {}; -const totals = {}; +const stats = {} as any; +const totals = {} as any; -const SocketRooms = module.exports; +const SocketRooms = {} as any; SocketRooms.stats = stats; SocketRooms.totals = totals; @@ -28,7 +29,6 @@ pubsub.on('sync:stats:end', (data) => { }); pubsub.on('sync:stats:guests', (eventId) => { - const Sockets = require('../index'); const guestCount = Sockets.getCountInRoom('online_guests'); pubsub.publish(eventId, guestCount); }); @@ -64,7 +64,7 @@ SocketRooms.getAll = async function () { category: 0, }; - for (const instance of Object.values(stats)) { + for (const instance of Object.values(stats) as any) { totals.onlineGuestCount += instance.onlineGuestCount; totals.onlineRegisteredCount += instance.onlineRegisteredCount; totals.socketCount += instance.socketCount; @@ -112,7 +112,6 @@ SocketRooms.getOnlineUserCount = function (io) { }; SocketRooms.getLocalStats = function () { - const Sockets = require('../index'); const io = Sockets.server; const socketData = { @@ -157,4 +156,7 @@ SocketRooms.getLocalStats = function () { return socketData; }; -require('../../promisify')(SocketRooms); +import promisify from '../../promisify'; +promisify(SocketRooms); + +export default SocketRooms; diff --git a/src/socket.io/admin/settings.ts b/src/socket.io/admin/settings.ts index 89208af698..a900aca067 100644 --- a/src/socket.io/admin/settings.ts +++ b/src/socket.io/admin/settings.ts @@ -1,9 +1,9 @@ 'use strict'; -const meta = require('../../meta'); -const events = require('../../events'); +import meta from '../../meta'; +import events from '../../events'; -const Settings = module.exports; +const Settings = {} as any; Settings.get = async function (socket, data) { return await meta.settings.get(data.hash); @@ -22,3 +22,5 @@ Settings.set = async function (socket, data) { Settings.clearSitemapCache = async function () { require('../../sitemap').clearCache(); }; + +export default Settings; \ No newline at end of file diff --git a/src/socket.io/admin/social.ts b/src/socket.io/admin/social.ts index 378d736e89..3154bd8ae0 100644 --- a/src/socket.io/admin/social.ts +++ b/src/socket.io/admin/social.ts @@ -1,9 +1,11 @@ 'use strict'; -const social = require('../../social'); +import social from '../../social'; -const SocketSocial = module.exports; +const SocketSocial = {} as any; SocketSocial.savePostSharingNetworks = async function (socket, data) { await social.setActivePostSharingNetworks(data); }; + +export default SocketSocial; \ No newline at end of file diff --git a/src/socket.io/admin/tags.ts b/src/socket.io/admin/tags.ts index cc67c017d1..7f474f1070 100644 --- a/src/socket.io/admin/tags.ts +++ b/src/socket.io/admin/tags.ts @@ -1,8 +1,8 @@ 'use strict'; -const topics = require('../../topics'); +import topics from '../../topics'; -const Tags = module.exports; +const Tags = {} as any; Tags.create = async function (socket, data) { if (!data) { @@ -27,3 +27,5 @@ Tags.deleteTags = async function (socket, data) { await topics.deleteTags(data.tags); }; + +export default Tags; \ No newline at end of file diff --git a/src/socket.io/admin/themes.ts b/src/socket.io/admin/themes.ts index 32e677bcf8..04705ff68f 100644 --- a/src/socket.io/admin/themes.ts +++ b/src/socket.io/admin/themes.ts @@ -1,9 +1,9 @@ 'use strict'; -const meta = require('../../meta'); -const widgets = require('../../widgets'); +import meta from '../../meta'; +import widgets from '../../widgets'; -const Themes = module.exports; +const Themes = {} as any; Themes.getInstalled = async function () { return await meta.themes.get(); @@ -22,3 +22,5 @@ Themes.set = async function (socket, data) { await meta.themes.set(data); }; + +export default Themes; \ No newline at end of file diff --git a/src/socket.io/admin/user.ts b/src/socket.io/admin/user.ts index 00c0a57f12..362e2d7a27 100644 --- a/src/socket.io/admin/user.ts +++ b/src/socket.io/admin/user.ts @@ -1,16 +1,17 @@ + 'use strict'; +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import groups from '../../groups'; +import user from '../../user'; +import events from '../../events'; +import translator from '../../translator'; +import sockets from '..'; +import notifications from '../../notifications'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); -const groups = require('../../groups'); -const user = require('../../user'); -const events = require('../../events'); -const translator = require('../../translator'); -const sockets = require('..'); - -const User = module.exports; +const User = {} as any; User.makeAdmins = async function (socket, uids) { if (!Array.isArray(uids)) { @@ -150,7 +151,6 @@ User.exportUsersCSV = async function (socket) { if (socket.emit) { socket.emit('event:export-users-csv'); } - const notifications = require('../../notifications'); const n = await notifications.create({ bodyShort: '[[notifications:users-csv-exported]]', path: '/api/admin/users/csv', @@ -158,8 +158,10 @@ User.exportUsersCSV = async function (socket) { from: socket.uid, }); await notifications.push(n, [socket.uid]); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }, 0); }; + +export default User; \ No newline at end of file diff --git a/src/socket.io/admin/widgets.ts b/src/socket.io/admin/widgets.ts index b2a4032f49..036a9bc139 100644 --- a/src/socket.io/admin/widgets.ts +++ b/src/socket.io/admin/widgets.ts @@ -1,8 +1,8 @@ 'use strict'; -const widgets = require('../../widgets'); +import widgets from '../../widgets'; -const Widgets = module.exports; +const Widgets = {} as any; Widgets.set = async function (socket, data) { if (!Array.isArray(data)) { @@ -10,3 +10,5 @@ Widgets.set = async function (socket, data) { } await widgets.setAreas(data); }; + +export default Widgets; diff --git a/src/socket.io/blacklist.ts b/src/socket.io/blacklist.ts index c38220f9ff..d3838b5975 100644 --- a/src/socket.io/blacklist.ts +++ b/src/socket.io/blacklist.ts @@ -1,11 +1,11 @@ 'use strict'; -const user = require('../user'); -const meta = require('../meta'); -const events = require('../events'); +import user from '../user'; +import meta from '../meta'; +import events from '../events'; -const SocketBlacklist = module.exports; +const SocketBlacklist = {} as any; SocketBlacklist.validate = async function (socket, data) { return meta.blacklist.validate(data.rules); @@ -33,4 +33,7 @@ async function blacklist(socket, method, rule) { }); } -require('../promisify')(SocketBlacklist); +import promisify from '../promisify'; +promisify(SocketBlacklist); + +export default SocketBlacklist; diff --git a/src/socket.io/categories.ts b/src/socket.io/categories.ts index 0a90698115..e36d0ee9aa 100644 --- a/src/socket.io/categories.ts +++ b/src/socket.io/categories.ts @@ -1,11 +1,11 @@ 'use strict'; -const categories = require('../categories'); -const privileges = require('../privileges'); -const user = require('../user'); -const topics = require('../topics'); +import categories from '../categories'; +import privileges from '../privileges'; +import user from '../user'; +import topics from '../topics'; -const SocketCategories = module.exports; +const SocketCategories = {} as any; require('./categories/search')(SocketCategories); @@ -164,4 +164,7 @@ SocketCategories.loadMoreSubCategories = async function (socket, data) { return category.children.slice(start, start + category.subCategoriesPerPage); }; -require('../promisify')(SocketCategories); +import promisify from '../promisify'; +promisify(SocketCategories); + +export default SocketCategories; diff --git a/src/socket.io/categories/search.ts b/src/socket.io/categories/search.ts index ad04c20edf..687a8d401e 100644 --- a/src/socket.io/categories/search.ts +++ b/src/socket.io/categories/search.ts @@ -1,14 +1,13 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import meta from '../../meta'; +import categories from '../../categories'; +import privileges from '../../privileges'; +import controllersHelpers from '../../controllers/helpers'; +import plugins from '../../plugins'; -const meta = require('../../meta'); -const categories = require('../../categories'); -const privileges = require('../../privileges'); -const controllersHelpers = require('../../controllers/helpers'); -const plugins = require('../../plugins'); - -module.exports = function (SocketCategories) { +export default function (SocketCategories) { // used by categorySearch module SocketCategories.categorySearch = async function (socket, data) { let cids = []; diff --git a/src/socket.io/groups.ts b/src/socket.io/groups.ts index 3b6f30a38d..039cdfb8de 100644 --- a/src/socket.io/groups.ts +++ b/src/socket.io/groups.ts @@ -1,12 +1,12 @@ 'use strict'; -const groups = require('../groups'); -const user = require('../user'); -const utils = require('../utils'); -const events = require('../events'); -const privileges = require('../privileges'); +import groups from '../groups'; +import user from '../user'; +import utils from '../utils'; +import events from '../events'; +import privileges from '../privileges'; -const SocketGroups = module.exports; +const SocketGroups = {} as any; SocketGroups.before = async (socket, method, data) => { if (!data) { @@ -288,4 +288,6 @@ function logGroupEvent(socket, event, additional) { }); } -require('../promisify')(SocketGroups); +import promisify from '../promisify'; +promisify(SocketGroups); +export default SocketGroups; \ No newline at end of file diff --git a/src/socket.io/helpers.ts b/src/socket.io/helpers.ts index 4dd3a31dd4..1463b1dc4a 100644 --- a/src/socket.io/helpers.ts +++ b/src/socket.io/helpers.ts @@ -1,20 +1,19 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import websockets from './index'; +import user from '../user'; +import posts from '../posts'; +import topics from '../topics'; +import categories from '../categories'; +import privileges from '../privileges'; +import notifications from '../notifications'; +import plugins from '../plugins'; +import utils from '../utils'; +import * as batch from '../batch'; -const db = require('../database'); -const websockets = require('./index'); -const user = require('../user'); -const posts = require('../posts'); -const topics = require('../topics'); -const categories = require('../categories'); -const privileges = require('../privileges'); -const notifications = require('../notifications'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const batch = require('../batch'); - -const SocketHelpers = module.exports; +const SocketHelpers = {} as any; SocketHelpers.notifyNew = async function (uid, type, result) { let uids = await user.getUidsFromSet('users:online', 0, -1); @@ -196,4 +195,7 @@ SocketHelpers.emitToUids = async function (event, data, uids) { uids.forEach(toUid => websockets.in(`uid_${toUid}`).emit(event, data)); }; -require('../promisify')(SocketHelpers); +import promisify from '../promisify'; +promisify(SocketHelpers); + +export default SocketHelpers; diff --git a/src/socket.io/index.ts b/src/socket.io/index.ts index b77edbb57d..9418240585 100644 --- a/src/socket.io/index.ts +++ b/src/socket.io/index.ts @@ -1,26 +1,30 @@ 'use strict'; -const os = require('os'); -const nconf = require('nconf'); -const winston = require('winston'); -const util = require('util'); -const validator = require('validator'); -const cookieParser = require('cookie-parser')(nconf.get('secret')); +import os from 'os'; +import nconf from 'nconf'; +import winston from 'winston'; +import util from 'util'; +import validator from 'validator'; +import cookieParserPkg from 'cookie-parser'; +import db from '../database'; +import user from '../user'; +import logger from '../logger'; +import plugins from '../plugins'; +import ratelimit from '../middleware/ratelimit'; +import socketIO from 'socket.io'; +import als from '../als'; +import meta from '../meta'; -const db = require('../database'); -const user = require('../user'); -const logger = require('../logger'); -const plugins = require('../plugins'); -const ratelimit = require('../middleware/ratelimit'); +const cookieParser = cookieParserPkg(nconf.get('secret')); const Namespaces = Object.create(null); -const Sockets = module.exports; +const Sockets = {} as any; Sockets.init = async function (server) { requireModules(); - const SocketIO = require('socket.io').Server; + const SocketIO = socketIO.Server; const io = new SocketIO({ path: `${nconf.get('relative_path')}/socket.io`, }); @@ -41,13 +45,13 @@ Sockets.init = async function (server) { const opts = { transports: nconf.get('socket.io:transports') || ['polling', 'websocket'], cookie: false, - }; + } as any; /* * Restrict socket.io listener to cookie domain. If none is set, infer based on url. * Production only so you don't get accidentally locked out. * Can be overridden via config (socket.io:origins) */ - if (process.env.NODE_ENV !== 'development' || nconf.get('socket.io:cors')) { + if ((process as any).env.NODE_ENV !== 'development' || nconf.get('socket.io:cors')) { const origins = nconf.get('socket.io:origins'); opts.cors = nconf.get('socket.io:cors') || { origin: origins, @@ -69,7 +73,6 @@ function onConnection(socket) { onConnect(socket); socket.onAny((event, ...args) => { const payload = { data: [event].concat(args) }; - const als = require('../als'); als.run({ uid: socket.uid }, onMessage, socket, payload); }); @@ -86,7 +89,7 @@ function onDisconnect(socket) { async function onConnect(socket) { try { await validateSession(socket, '[[error:invalid-session]]'); - } catch (e) { + } catch (e: any) { if (e.message === '[[error:invalid-session]]') { socket.emit('event:invalid_session'); } @@ -130,7 +133,7 @@ async function onMessage(socket, payload) { }, Namespaces); if (!methodToCall || typeof methodToCall !== 'function') { - if (process.env.NODE_ENV === 'development') { + if ((process as any).env.NODE_ENV === 'development') { winston.warn(`[socket.io] Unrecognized message: ${eventName}`); } const escapedName = validator.escape(String(eventName)); @@ -164,7 +167,7 @@ async function onMessage(socket, payload) { callback(err ? { message: err.message } : null, result); }); } - } catch (err) { + } catch (err: any) { winston.error(`${eventName}\n${err.stack ? err.stack : err.message}`); callback({ message: err.message }); } @@ -178,12 +181,11 @@ function requireModules() { ]; modules.forEach((module) => { - Namespaces[module] = require(`./${module}`); + Namespaces[module] = require(`./${module}`); }); } async function checkMaintenance(socket) { - const meta = require('../meta'); if (!meta.config.maintenanceMode) { return; } @@ -191,7 +193,6 @@ async function checkMaintenance(socket) { if (isAdmin) { return; } - const validator = require('validator'); throw new Error(`[[pages:maintenance.text, ${validator.escape(String(meta.config.title || 'NodeBB'))}]]`); } @@ -239,7 +240,7 @@ async function authorize(socket, callback) { request: request, }); - const sessionData = await getSessionAsync(sessionId); + const sessionData: any = await getSessionAsync(sessionId); if (sessionData && sessionData.passport && sessionData.passport.user) { request.session = sessionData; @@ -276,3 +277,5 @@ Sockets.warnDeprecated = (socket, replacement) => { } winston.warn(`[deprecated]\n ${new Error('-').stack.split('\n').slice(2, 5).join('\n')}\n use ${replacement}`); }; + +export default Sockets; \ No newline at end of file diff --git a/src/socket.io/meta.ts b/src/socket.io/meta.ts index 68230bd6f0..535934b92a 100644 --- a/src/socket.io/meta.ts +++ b/src/socket.io/meta.ts @@ -1,12 +1,12 @@ 'use strict'; -const user = require('../user'); -const topics = require('../topics'); +import user from '../user'; +import topics from '../topics'; const SocketMeta = { rooms: {}, -}; +} as any; SocketMeta.reconnected = function (socket, data, callback) { callback = callback || function () {}; @@ -60,4 +60,4 @@ function leaveCurrentRoom(socket) { } } -module.exports = SocketMeta; +export default SocketMeta; diff --git a/src/socket.io/modules.ts b/src/socket.io/modules.ts index 1a23fc1067..2244de5095 100644 --- a/src/socket.io/modules.ts +++ b/src/socket.io/modules.ts @@ -1,17 +1,16 @@ 'use strict'; -const db = require('../database'); -const notifications = require('../notifications'); -const Messaging = require('../messaging'); -const utils = require('../utils'); -const server = require('./index'); -const user = require('../user'); -const privileges = require('../privileges'); +import db from '../database'; +import notifications from '../notifications'; +import Messaging from '../messaging'; +import utils from '../utils'; +import server from './index'; +import user from '../user'; +import privileges from '../privileges'; +import sockets from '.'; +import api from '../api'; -const sockets = require('.'); -const api = require('../api'); - -const SocketModules = module.exports; +const SocketModules = {} as any; SocketModules.chats = {}; SocketModules.settings = {}; @@ -251,4 +250,7 @@ SocketModules.chats.getIP = async function (socket, mid) { return await Messaging.getMessageField(mid, 'ip'); }; -require('../promisify')(SocketModules); +import promisify from '../promisify'; +promisify(SocketModules); + +export default SocketModules; \ No newline at end of file diff --git a/src/socket.io/notifications.ts b/src/socket.io/notifications.ts index 2b0df88114..e58a37ebf5 100644 --- a/src/socket.io/notifications.ts +++ b/src/socket.io/notifications.ts @@ -1,9 +1,9 @@ 'use strict'; -const user = require('../user'); -const notifications = require('../notifications'); +import user from '../user'; +import notifications from '../notifications'; -const SocketNotifs = module.exports; +const SocketNotifs = {} as any; SocketNotifs.get = async function (socket, data) { if (data && Array.isArray(data.nids) && socket.uid) { @@ -39,4 +39,7 @@ SocketNotifs.markAllRead = async function (socket) { user.notifications.pushCount(socket.uid); }; -require('../promisify')(SocketNotifs); +import promisify from '../promisify'; +promisify(SocketNotifs); + +export default SocketNotifs; \ No newline at end of file diff --git a/src/socket.io/plugins.ts b/src/socket.io/plugins.ts index ac197c0024..32e54d8494 100644 --- a/src/socket.io/plugins.ts +++ b/src/socket.io/plugins.ts @@ -7,11 +7,11 @@ const SocketPlugins = {}; How? From your plugin: - const SocketPlugins = require.main.require('./src/socket.io/plugins'); + const SocketPlugins = require.main.require('./src/socket.io/plugins'; SocketPlugins.myPlugin = {}; SocketPlugins.myPlugin.myMethod = function(socket, data, callback) { ... }; Be a good lad and namespace your methods. */ -module.exports = SocketPlugins; +export default SocketPlugins; diff --git a/src/socket.io/posts.ts b/src/socket.io/posts.ts index 6b257ca525..5292761cf5 100644 --- a/src/socket.io/posts.ts +++ b/src/socket.io/posts.ts @@ -1,22 +1,23 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; +import db from '../database'; +import posts from '../posts'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import meta from '../meta'; +import topics from '../topics'; +import user from '../user'; +import notifications from '../notifications'; +import utils from '../utils'; +import events from '../events'; +import votes from './posts/votes'; +import tools from './posts/tools'; -const db = require('../database'); -const posts = require('../posts'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const meta = require('../meta'); -const topics = require('../topics'); -const user = require('../user'); -const notifications = require('../notifications'); -const utils = require('../utils'); -const events = require('../events'); +const SocketPosts = {} as any; -const SocketPosts = module.exports; - -require('./posts/votes')(SocketPosts); -require('./posts/tools')(SocketPosts); +votes(SocketPosts); +tools(SocketPosts); SocketPosts.getRawPost = async function (socket, pid) { const canRead = await privileges.posts.can('topics:read', pid, socket.uid); @@ -128,7 +129,7 @@ async function logQueueEvent(socket, result, type) { ip: socket.ip, content: result.data.content, targetUid: result.uid, - }; + } as any; if (result.type === 'topic') { eventData.cid = result.data.cid; eventData.title = result.data.title; @@ -156,13 +157,13 @@ async function canEditQueue(socket, data, action) { } } -async function sendQueueNotification(type, targetUid, path, notificationText) { +async function sendQueueNotification(type, targetUid, path, notificationText?) { const notifData = { type: type, nid: `${type}-${targetUid}-${path}`, bodyShort: notificationText ? `[[notifications:${type}, ${notificationText}]]` : `[[notifications:${type}]]`, path: path, - }; + } as any; if (parseInt(meta.config.postQueueNotificationUid, 10) > 0) { notifData.from = meta.config.postQueueNotificationUid; } @@ -181,4 +182,7 @@ SocketPosts.editQueuedContent = async function (socket, data) { return { postData: data }; }; -require('../promisify')(SocketPosts); +import promisify from '../promisify'; +promisify(SocketPosts); + +export default SocketPosts; diff --git a/src/socket.io/posts/tools.ts b/src/socket.io/posts/tools.ts index db6e432fa6..f9a114ecfa 100644 --- a/src/socket.io/posts/tools.ts +++ b/src/socket.io/posts/tools.ts @@ -1,18 +1,17 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; +import db from '../../database'; +import posts from '../../posts'; +import flags from '../../flags'; +import events from '../../events'; +import privileges from '../../privileges'; +import plugins from '../../plugins'; +import social from '../../social'; +import user from '../../user'; +import utils from '../../utils'; -const db = require('../../database'); -const posts = require('../../posts'); -const flags = require('../../flags'); -const events = require('../../events'); -const privileges = require('../../privileges'); -const plugins = require('../../plugins'); -const social = require('../../social'); -const user = require('../../user'); -const utils = require('../../utils'); - -module.exports = function (SocketPosts) { +export default function (SocketPosts) { SocketPosts.loadPostTools = async function (socket, data) { if (!data || !data.pid || !data.cid) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/posts/votes.ts b/src/socket.io/posts/votes.ts index 0ecd8196ef..99a8badb11 100644 --- a/src/socket.io/posts/votes.ts +++ b/src/socket.io/posts/votes.ts @@ -1,12 +1,12 @@ 'use strict'; -const db = require('../../database'); -const user = require('../../user'); -const posts = require('../../posts'); -const privileges = require('../../privileges'); -const meta = require('../../meta'); +import db from '../../database'; +import user from '../../user'; +import posts from '../../posts'; +import privileges from '../../privileges'; +import meta from '../../meta'; -module.exports = function (SocketPosts) { +export default function (SocketPosts) { SocketPosts.getVoters = async function (socket, data) { if (!data || !data.pid || !data.cid) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/topics.ts b/src/socket.io/topics.ts index c07e6410c1..f15ca5097c 100644 --- a/src/socket.io/topics.ts +++ b/src/socket.io/topics.ts @@ -1,24 +1,30 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import posts from '../posts'; +import topics from '../topics'; +import user from '../user'; +import meta from '../meta'; +import privileges from '../privileges'; +import cache from '../cache'; +import events from '../events'; -const db = require('../database'); -const posts = require('../posts'); -const topics = require('../topics'); -const user = require('../user'); -const meta = require('../meta'); -const privileges = require('../privileges'); -const cache = require('../cache'); -const events = require('../events'); +const SocketTopics = {} as any; -const SocketTopics = module.exports; +import unread from './topics/unread'; +import move from './topics/move'; +import tools from './topics/tools'; +import infinitescroll from './topics/infinitescroll'; +import tags from './topics/tags'; +import merge from './topics/merge'; -require('./topics/unread')(SocketTopics); -require('./topics/move')(SocketTopics); -require('./topics/tools')(SocketTopics); -require('./topics/infinitescroll')(SocketTopics); -require('./topics/tags')(SocketTopics); -require('./topics/merge')(SocketTopics); +unread(SocketTopics); +move(SocketTopics); +tools(SocketTopics); +infinitescroll(SocketTopics); +tags(SocketTopics); +merge(SocketTopics); SocketTopics.postcount = async function (socket, tid) { const canRead = await privileges.topics.can('topics:read', tid, socket.uid); @@ -128,4 +134,7 @@ SocketTopics.getPostCountInTopic = async function (socket, tid) { return await db.sortedSetScore(`tid:${tid}:posters`, socket.uid); }; -require('../promisify')(SocketTopics); +import promisify from '../promisify'; +promisify(SocketTopics); + +export default SocketTopics; \ No newline at end of file diff --git a/src/socket.io/topics/infinitescroll.ts b/src/socket.io/topics/infinitescroll.ts index 2e9e95948e..7db5bdc578 100644 --- a/src/socket.io/topics/infinitescroll.ts +++ b/src/socket.io/topics/infinitescroll.ts @@ -1,12 +1,12 @@ 'use strict'; -const topics = require('../../topics'); -const privileges = require('../../privileges'); -const meta = require('../../meta'); -const utils = require('../../utils'); -const social = require('../../social'); +import topics from '../../topics'; +import privileges from '../../privileges'; +import meta from '../../meta'; +import utils from '../../utils'; +import social from '../../social'; -module.exports = function (SocketTopics) { +export default function (SocketTopics) { SocketTopics.loadMore = async function (socket, data) { if (!data || !data.tid || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/topics/merge.ts b/src/socket.io/topics/merge.ts index 238faa563d..9f4e9e4f23 100644 --- a/src/socket.io/topics/merge.ts +++ b/src/socket.io/topics/merge.ts @@ -1,10 +1,10 @@ 'use strict'; -const topics = require('../../topics'); -const privileges = require('../../privileges'); -const events = require('../../events'); +import topics from '../../topics'; +import privileges from '../../privileges'; +import events from '../../events'; -module.exports = function (SocketTopics) { +export default function (SocketTopics) { SocketTopics.merge = async function (socket, data) { if (!data || !Array.isArray(data.tids)) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/topics/move.ts b/src/socket.io/topics/move.ts index 5caeaad9f3..9c9e29a09f 100644 --- a/src/socket.io/topics/move.ts +++ b/src/socket.io/topics/move.ts @@ -1,14 +1,14 @@ 'use strict'; -const async = require('async'); -const user = require('../../user'); -const topics = require('../../topics'); -const categories = require('../../categories'); -const privileges = require('../../privileges'); -const socketHelpers = require('../helpers'); -const events = require('../../events'); +import async from 'async'; +import user from '../../user'; +import topics from '../../topics'; +import categories from '../../categories'; +import privileges from '../../privileges'; +import socketHelpers from '../helpers'; +import events from '../../events'; -module.exports = function (SocketTopics) { +export default function (SocketTopics) { SocketTopics.move = async function (socket, data) { if (!data || !Array.isArray(data.tids) || !data.cid) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/topics/tags.ts b/src/socket.io/topics/tags.ts index 117b63c31a..fb8c92432a 100644 --- a/src/socket.io/topics/tags.ts +++ b/src/socket.io/topics/tags.ts @@ -1,13 +1,13 @@ 'use strict'; -const meta = require('../../meta'); -const user = require('../../user'); -const topics = require('../../topics'); -const categories = require('../../categories'); -const privileges = require('../../privileges'); -const utils = require('../../utils'); +import meta from '../../meta'; +import user from '../../user'; +import topics from '../../topics'; +import categories from '../../categories'; +import privileges from '../../privileges'; +import utils from '../../utils'; -module.exports = function (SocketTopics) { +export default function (SocketTopics) { SocketTopics.isTagAllowed = async function (socket, data) { if (!data || !utils.isNumber(data.cid) || !data.tag) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/topics/tools.ts b/src/socket.io/topics/tools.ts index baafd88d1a..c9f1e1f915 100644 --- a/src/socket.io/topics/tools.ts +++ b/src/socket.io/topics/tools.ts @@ -1,10 +1,10 @@ 'use strict'; -const topics = require('../../topics'); -const privileges = require('../../privileges'); -const plugins = require('../../plugins'); +import topics from '../../topics'; +import privileges from '../../privileges'; +import plugins from '../../plugins'; -module.exports = function (SocketTopics) { +export default function (SocketTopics) { SocketTopics.loadTopicTools = async function (socket, data) { if (!socket.uid) { throw new Error('[[error:no-privileges]]'); diff --git a/src/socket.io/topics/unread.ts b/src/socket.io/topics/unread.ts index cd93169983..af990a4b85 100644 --- a/src/socket.io/topics/unread.ts +++ b/src/socket.io/topics/unread.ts @@ -1,10 +1,10 @@ 'use strict'; -const db = require('../../database'); -const user = require('../../user'); -const topics = require('../../topics'); +import db from '../../database'; +import user from '../../user'; +import topics from '../../topics'; -module.exports = function (SocketTopics) { +export default function (SocketTopics) { SocketTopics.markAsRead = async function (socket, tids) { if (!Array.isArray(tids) || socket.uid <= 0) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/uploads.ts b/src/socket.io/uploads.ts index 66b7266b01..6c11c69148 100644 --- a/src/socket.io/uploads.ts +++ b/src/socket.io/uploads.ts @@ -1,13 +1,13 @@ 'use strict'; -const socketUser = require('./user'); -const socketGroup = require('./groups'); -const image = require('../image'); -const meta = require('../meta'); +import socketUser from './user'; +import socketGroup from './groups'; +import image from '../image'; +import meta from '../meta'; const inProgress = {}; -const uploads = module.exports; +const uploads = {} as any; uploads.upload = async function (socket, data) { const methodToFunc = { @@ -42,7 +42,7 @@ uploads.upload = async function (socket, data) { const result = await methodToFunc[data.params.method](socket, data.params); delete socketUploads[method]; return result; - } catch (err) { + } catch (err: any) { delete inProgress[socket.id]; throw err; } @@ -51,3 +51,5 @@ uploads.upload = async function (socket, data) { uploads.clear = function (sid) { delete inProgress[sid]; }; + +export default uploads; diff --git a/src/socket.io/user.ts b/src/socket.io/user.ts index d82785b042..f7bae1c999 100644 --- a/src/socket.io/user.ts +++ b/src/socket.io/user.ts @@ -1,28 +1,33 @@ 'use strict'; -const util = require('util'); -const winston = require('winston'); +import util from 'util'; +import winston from 'winston'; +import user from '../user'; +import topics from '../topics'; +import messaging from '../messaging'; +import plugins from '../plugins'; +import meta from '../meta'; +import events from '../events'; +import emailer from '../emailer'; +import db from '../database'; +import userController from '../controllers/user'; +import privileges from '../privileges'; +import utils from '../utils'; const sleep = util.promisify(setTimeout); -const user = require('../user'); -const topics = require('../topics'); -const messaging = require('../messaging'); -const plugins = require('../plugins'); -const meta = require('../meta'); -const events = require('../events'); -const emailer = require('../emailer'); -const db = require('../database'); -const userController = require('../controllers/user'); -const privileges = require('../privileges'); -const utils = require('../utils'); -const SocketUser = module.exports; +const SocketUser = {} as any; -require('./user/profile')(SocketUser); -require('./user/status')(SocketUser); -require('./user/picture')(SocketUser); -require('./user/registration')(SocketUser); +import profile from './user/profile'; +import status from './user/status'; +import picture from './user/picture'; +import registration from './user/registration'; + +profile(SocketUser); +status(SocketUser); +picture(SocketUser); +registration(SocketUser); // Password Reset SocketUser.reset = {}; @@ -48,7 +53,7 @@ SocketUser.reset.send = async function (socket, email) { await user.reset.send(email); await logEvent('[[success:success]]'); await sleep(2500 + ((Math.random() * 500) - 250)); - } catch (err) { + } catch (err: any) { await logEvent(err.message); await sleep(2500 + ((Math.random() * 500) - 250)); const internalErrors = ['[[error:invalid-email]]', '[[error:reset-rate-limited]]']; @@ -175,4 +180,7 @@ SocketUser.gdpr.check = async function (socket, data) { return await db.getObjectField(`user:${data.uid}`, 'gdpr_consent'); }; -require('../promisify')(SocketUser); +import promisify from '../promisify'; +promisify(SocketUser); + +export default SocketUser; diff --git a/src/socket.io/user/picture.ts b/src/socket.io/user/picture.ts index 32a4f0e30c..37c364aa99 100644 --- a/src/socket.io/user/picture.ts +++ b/src/socket.io/user/picture.ts @@ -1,9 +1,9 @@ 'use strict'; -const user = require('../../user'); -const plugins = require('../../plugins'); +import user from '../../user'; +import plugins from '../../plugins'; -module.exports = function (SocketUser) { +export default function (SocketUser) { SocketUser.removeUploadedPicture = async function (socket, data) { if (!socket.uid || !data || !data.uid) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/user/profile.ts b/src/socket.io/user/profile.ts index 5d4c4624f3..afb1520c9b 100644 --- a/src/socket.io/user/profile.ts +++ b/src/socket.io/user/profile.ts @@ -1,10 +1,10 @@ 'use strict'; -const user = require('../../user'); -const privileges = require('../../privileges'); -const plugins = require('../../plugins'); +import user from '../../user'; +import privileges from '../../privileges'; +import plugins from '../../plugins'; -module.exports = function (SocketUser) { +export default function (SocketUser) { SocketUser.updateCover = async function (socket, data) { if (!socket.uid) { throw new Error('[[error:no-privileges]]'); diff --git a/src/socket.io/user/registration.ts b/src/socket.io/user/registration.ts index b8e4f39d98..ec524cc851 100644 --- a/src/socket.io/user/registration.ts +++ b/src/socket.io/user/registration.ts @@ -1,9 +1,9 @@ 'use strict'; -const user = require('../../user'); -const events = require('../../events'); +import user from '../../user'; +import events from '../../events'; -module.exports = function (SocketUser) { +export default function (SocketUser) { SocketUser.acceptRegistration = async function (socket, data) { const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(socket.uid); if (!isAdminOrGlobalMod) { diff --git a/src/socket.io/user/status.ts b/src/socket.io/user/status.ts index a00c1a6e9b..777fb7b853 100644 --- a/src/socket.io/user/status.ts +++ b/src/socket.io/user/status.ts @@ -1,9 +1,9 @@ 'use strict'; -const user = require('../../user'); -const websockets = require('../index'); +import user from '../../user'; +import websockets from '../index'; -module.exports = function (SocketUser) { +export default function (SocketUser) { SocketUser.checkStatus = async function (socket, uid) { if (!socket.uid) { throw new Error('[[error:invalid-uid]]'); @@ -22,7 +22,7 @@ module.exports = function (SocketUser) { throw new Error('[[error:invalid-user-status]]'); } - const userData = { status: status }; + const userData = { status: status } as any; if (status !== 'offline') { userData.lastonline = Date.now(); } diff --git a/src/start.ts b/src/start.ts index f87f0b4ddf..307d6dc189 100644 --- a/src/start.ts +++ b/src/start.ts @@ -1,9 +1,18 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); +import nconf from 'nconf'; +import winston from 'winston'; +import * as webserver from './webserver'; +import sockets from './socket.io'; +import db from './database'; +import meta from './meta'; +import upgrade from './upgrade'; +import notifications from './notifications'; +import plugins from './plugins'; +import topics from './topics'; +import user from './user'; -const start = module.exports; +const start = {} as any; start.start = async function () { printStartupInfo(); @@ -11,15 +20,13 @@ start.start = async function () { addProcessHandlers(); try { - const db = require('./database'); + await db.init(); await db.checkCompatibility(); - - const meta = require('./meta'); await meta.configs.init(); if (nconf.get('runJobs')) { - await runUpgrades(); + await runUpgrades(); } if (nconf.get('dep-check') === undefined || nconf.get('dep-check') !== false) { @@ -30,26 +37,25 @@ start.start = async function () { await db.initSessionStore(); - const webserver = require('./webserver'); - const sockets = require('./socket.io'); + await sockets.init(webserver.server); if (nconf.get('runJobs')) { - require('./notifications').startJobs(); - require('./user').startJobs(); - require('./plugins').startJobs(); - require('./topics').scheduled.startJobs(); + notifications.startJobs(); + user.startJobs(); + plugins.startJobs(); + topics.scheduled.startJobs(); await db.delete('locks'); } await webserver.listen(); - if (process.send) { - process.send({ + if ((process as any).send) { + (process as any).send({ action: 'listening', }); } - } catch (err) { + } catch (err: any) { switch (err.message) { case 'dependencies-out-of-date': winston.error('One or more of NodeBB\'s dependent packages are out-of-date. Please run the following command to update them:'); @@ -65,15 +71,14 @@ start.start = async function () { } // Either way, bad stuff happened. Abort start. - process.exit(); + (process as any).exit(); } }; async function runUpgrades() { - const upgrade = require('./upgrade'); try { await upgrade.check(); - } catch (err) { + } catch (err: any) { if (err && err.message === 'schema-out-of-date') { await upgrade.run(); } else { @@ -94,23 +99,25 @@ function printStartupInfo() { } } +import benchpressjs from 'benchpressjs'; +import translator from './translator'; + + function addProcessHandlers() { - process.on('SIGTERM', shutdown); - process.on('SIGINT', shutdown); - process.on('SIGHUP', restart); - process.on('uncaughtException', (err) => { + (process as any).on('SIGTERM', shutdown); + (process as any).on('SIGINT', shutdown); + (process as any).on('SIGHUP', restart); + (process as any).on('uncaughtException', (err) => { winston.error(err.stack); require('./meta').js.killMinifier(); shutdown(1); }); - process.on('message', (msg) => { + (process as any).on('message', (msg) => { if (msg && Array.isArray(msg.compiling)) { if (msg.compiling.includes('tpl')) { - const benchpressjs = require('benchpressjs'); benchpressjs.flush(); } else if (msg.compiling.includes('lang')) { - const translator = require('./translator'); translator.flush(); } } @@ -118,9 +125,9 @@ function addProcessHandlers() { } function restart() { - if (process.send) { + if ((process as any).send) { winston.info('[app] Restarting...'); - process.send({ + (process as any).send({ action: 'restart', }); } else { @@ -139,9 +146,11 @@ async function shutdown(code) { await require('./database').close(); winston.info('[app] Database connection closed.'); winston.info('[app] Shutdown complete.'); - process.exit(code || 0); - } catch (err) { + (process as any).exit(code || 0); + } catch (err: any) { winston.error(err.stack); - return process.exit(code || 0); + return (process as any).exit(code || 0); } } + +export default start; \ No newline at end of file diff --git a/src/topics/bookmarks.ts b/src/topics/bookmarks.ts index e7d52f84ae..6cf842df6c 100644 --- a/src/topics/bookmarks.ts +++ b/src/topics/bookmarks.ts @@ -1,12 +1,11 @@ 'use strict'; -const async = require('async'); +import async from 'async'; +import db from '../database'; +import user from '../user'; -const db = require('../database'); -const user = require('../user'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.getUserBookmark = async function (tid, uid) { if (parseInt(uid, 10) <= 0) { return null; @@ -67,3 +66,4 @@ module.exports = function (Topics) { }); }; }; + diff --git a/src/topics/create.ts b/src/topics/create.ts index fe0d710bed..410f2eb053 100644 --- a/src/topics/create.ts +++ b/src/topics/create.ts @@ -1,21 +1,20 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import utils from '../utils'; +import slugify from '../slugify'; +import plugins from '../plugins'; +import analytics from '../analytics'; +import user from '../user'; +import meta from '../meta'; +import posts from '../posts'; +import privileges from '../privileges'; +import categories from '../categories'; +import translator from '../translator'; -const db = require('../database'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const plugins = require('../plugins'); -const analytics = require('../analytics'); -const user = require('../user'); -const meta = require('../meta'); -const posts = require('../posts'); -const privileges = require('../privileges'); -const categories = require('../categories'); -const translator = require('../translator'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.create = async function (data) { // This is an internal method, consider using Topics.post instead const timestamp = data.timestamp || Date.now(); @@ -33,7 +32,7 @@ module.exports = function (Topics) { lastposttime: 0, postcount: 0, viewcount: 0, - }; + } as any; if (Array.isArray(data.tags) && data.tags.length) { topicData.tags = data.tags.join(','); diff --git a/src/topics/data.ts b/src/topics/data.ts index 1260c092e1..4965268798 100644 --- a/src/topics/data.ts +++ b/src/topics/data.ts @@ -1,12 +1,11 @@ 'use strict'; -const validator = require('validator'); - -const db = require('../database'); -const categories = require('../categories'); -const utils = require('../utils'); -const translator = require('../translator'); -const plugins = require('../plugins'); +import validator from 'validator'; +import db from '../database'; +import categories from '../categories'; +import utils from '../utils'; +import translator from '../translator'; +import plugins from '../plugins'; const intFields = [ 'tid', 'cid', 'uid', 'mainPid', 'postcount', @@ -15,7 +14,7 @@ const intFields = [ 'deleterUid', ]; -module.exports = function (Topics) { +export default function (Topics) { Topics.getTopicsFields = async function (tids, fields) { if (!Array.isArray(tids) || !tids.length) { return []; diff --git a/src/topics/delete.ts b/src/topics/delete.ts index 2e088f35c5..79f71a0cd8 100644 --- a/src/topics/delete.ts +++ b/src/topics/delete.ts @@ -1,15 +1,14 @@ 'use strict'; -const db = require('../database'); - -const user = require('../user'); -const posts = require('../posts'); -const categories = require('../categories'); -const plugins = require('../plugins'); -const batch = require('../batch'); +import db from '../database'; +import user from '../user'; +import posts from '../posts'; +import categories from '../categories'; +import plugins from '../plugins'; +import * as batch from '../batch'; -module.exports = function (Topics) { +export default function (Topics) { Topics.delete = async function (tid, uid) { await removeTopicPidsFromCid(tid); await Topics.setTopicFields(tid, { diff --git a/src/topics/events.ts b/src/topics/events.ts index 95f3d772d3..f4c085d4d1 100644 --- a/src/topics/events.ts +++ b/src/topics/events.ts @@ -1,21 +1,24 @@ 'use strict'; -const _ = require('lodash'); -const nconf = require('nconf'); -const db = require('../database'); -const meta = require('../meta'); -const user = require('../user'); -const posts = require('../posts'); -const categories = require('../categories'); -const plugins = require('../plugins'); -const translator = require('../translator'); -const privileges = require('../privileges'); -const utils = require('../utils'); -const helpers = require('../helpers'); +import _ from 'lodash'; +import nconf from 'nconf'; +import db from '../database'; +import meta from '../meta'; +import user from '../user'; +import posts from '../posts'; +import categories from '../categories'; +import plugins from '../plugins'; +import translator from '../translator'; +import privileges from '../privileges'; +import utils from '../utils'; +import helpers from '../helpers'; +import topics from '.'; + + const relative_path = nconf.get('relative_path'); -const Events = module.exports; +const Events = {} as any; /** * Note: Plugins! @@ -112,7 +115,6 @@ function renderTimeago(event) { } Events.get = async (tid, uid, reverse = false) => { - const topics = require('.'); if (!await topics.exists(tid)) { throw new Error('[[error:no-topic]]'); @@ -147,7 +149,7 @@ async function getCategoryInfo(cids) { return _.zipObject(uniqCids, catData); } -async function modifyEvent({ tid, uid, eventIds, timestamps, events }) { +async function modifyEvent({ tid, uid, eventIds, timestamps, events }: any) { // Add posts from post queue const isPrivileged = await user.isPrivileged(uid); if (isPrivileged) { @@ -211,7 +213,6 @@ async function modifyEvent({ tid, uid, eventIds, timestamps, events }) { } Events.log = async (tid, payload) => { - const topics = require('.'); const { type } = payload; const timestamp = payload.timestamp || Date.now(); @@ -254,3 +255,5 @@ Events.purge = async (tid, eventIds = []) => { await db.deleteAll(keys); } }; + +export default Events; \ No newline at end of file diff --git a/src/topics/follow.ts b/src/topics/follow.ts index 2cd856134c..5204f59a87 100644 --- a/src/topics/follow.ts +++ b/src/topics/follow.ts @@ -1,13 +1,13 @@ 'use strict'; -const db = require('../database'); -const notifications = require('../notifications'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import db from '../database'; +import notifications from '../notifications'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import utils from '../utils'; -module.exports = function (Topics) { +export default function (Topics) { Topics.toggleFollow = async function (tid, uid) { const exists = await Topics.exists(tid); if (!exists) { diff --git a/src/topics/fork.ts b/src/topics/fork.ts index 97b5316656..dfb69c153a 100644 --- a/src/topics/fork.ts +++ b/src/topics/fork.ts @@ -1,14 +1,14 @@ 'use strict'; -const db = require('../database'); -const posts = require('../posts'); -const categories = require('../categories'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const meta = require('../meta'); +import db from '../database'; +import posts from '../posts'; +import categories from '../categories'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import meta from '../meta'; -module.exports = function (Topics) { +export default function (Topics) { Topics.createTopicFromPosts = async function (uid, title, pids, fromTid) { if (title) { title = title.trim(); diff --git a/src/topics/index.ts b/src/topics/index.ts index ef08b7ccde..9153aa2a3c 100644 --- a/src/topics/index.ts +++ b/src/topics/index.ts @@ -1,39 +1,63 @@ 'use strict'; -const _ = require('lodash'); -const validator = require('validator'); +import _ from 'lodash'; +import validator from 'validator'; +console.log(0); +import db from '../database'; +console.log('D 1'); +import posts from '../posts'; +console.log('P 2'); +import utils from '../utils'; +import plugins from '../plugins'; +import meta from '../meta'; +import user from '../user'; +import categories from '../categories'; +import privileges from '../privileges'; +import social from '../social'; -const db = require('../database'); -const posts = require('../posts'); -const utils = require('../utils'); -const plugins = require('../plugins'); -const meta = require('../meta'); -const user = require('../user'); -const categories = require('../categories'); -const privileges = require('../privileges'); -const social = require('../social'); +const Topics = {} as any; -const Topics = module.exports; +import data from './data'; +import create from './create'; +import deleteTopic from './delete'; +import sorted from './sorted'; +import unread from './unread'; +import recent from './recent'; +import userFn from './user'; +import fork from './fork'; +console.log(1); +import postsFn from './posts'; +console.log(2); +import follow from './follow'; +import tags from './tags'; +import teaser from './teaser'; +import suggested from './suggested'; +import tools from './tools'; +import bookmarks from './bookmarks'; +import merge from './merge'; +import scheduled from './scheduled'; +import thumbs from './thumbs'; +import events from './events'; -require('./data')(Topics); -require('./create')(Topics); -require('./delete')(Topics); -require('./sorted')(Topics); -require('./unread')(Topics); -require('./recent')(Topics); -require('./user')(Topics); -require('./fork')(Topics); -require('./posts')(Topics); -require('./follow')(Topics); -require('./tags')(Topics); -require('./teaser')(Topics); -Topics.scheduled = require('./scheduled'); -require('./suggested')(Topics); -require('./tools')(Topics); -Topics.thumbs = require('./thumbs'); -require('./bookmarks')(Topics); -require('./merge')(Topics); -Topics.events = require('./events'); +data(Topics); +create(Topics); +deleteTopic(Topics); +sorted(Topics); +unread(Topics); +recent(Topics); +userFn(Topics); +fork(Topics); +postsFn(Topics); +follow(Topics); +tags(Topics); +teaser(Topics); +Topics.scheduled = scheduled; +suggested(Topics); +tools(Topics); +Topics.thumbs = thumbs; +bookmarks(Topics); +merge(Topics); +Topics.events = events; Topics.exists = async function (tids) { return await db.exists( @@ -287,4 +311,7 @@ Topics.search = async function (tid, term) { return Array.isArray(result) ? result : result.ids; }; -require('../promisify')(Topics); +import promisify from '../promisify'; +promisify(Topics); + +export default Topics; \ No newline at end of file diff --git a/src/topics/merge.ts b/src/topics/merge.ts index 1a06adefbb..ade29fa271 100644 --- a/src/topics/merge.ts +++ b/src/topics/merge.ts @@ -1,9 +1,9 @@ 'use strict'; -const plugins = require('../plugins'); -const posts = require('../posts'); +import plugins from '../plugins'; +import posts from '../posts'; -module.exports = function (Topics) { +export default function (Topics) { Topics.merge = async function (tids, uid, options) { options = options || {}; @@ -21,7 +21,7 @@ module.exports = function (Topics) { } const otherTids = tids.sort((a, b) => a - b) - .filter(tid => tid && parseInt(tid, 10) !== parseInt(mergeIntoTid, 10)); + .filter(tid => tid && parseInt(tid, 10) !== parseInt(mergeIntoTid as any, 10)); for (const tid of otherTids) { /* eslint-disable no-await-in-loop */ diff --git a/src/topics/posts.ts b/src/topics/posts.ts index fcc4355bdf..f95cd9dc35 100644 --- a/src/topics/posts.ts +++ b/src/topics/posts.ts @@ -1,20 +1,19 @@ 'use strict'; -const _ = require('lodash'); -const validator = require('validator'); -const nconf = require('nconf'); - -const db = require('../database'); -const user = require('../user'); -const posts = require('../posts'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import _ from 'lodash'; +import validator from 'validator'; +import nconf from 'nconf'; +import db from '../database'; +import user from '../user'; +import posts from '../posts'; +import meta from '../meta'; +import plugins from '../plugins'; +import utils from '../utils'; const backlinkRegex = new RegExp(`(?:${nconf.get('url').replace('/', '\\/')}|\b|\\s)\\/topic\\/(\\d+)(?:\\/\\w+)?`, 'g'); -module.exports = function (Topics) { +export default function (Topics) { Topics.onNewPostMade = async function (postData) { await Topics.updateLastPostTime(postData.tid, postData.timestamp); await Topics.addPostToTopic(postData.tid, postData); diff --git a/src/topics/recent.ts b/src/topics/recent.ts index 06c0482c81..8065753d87 100644 --- a/src/topics/recent.ts +++ b/src/topics/recent.ts @@ -1,11 +1,11 @@ 'use strict'; -const db = require('../database'); -const plugins = require('../plugins'); -const posts = require('../posts'); +import db from '../database'; +import plugins from '../plugins'; +import posts from '../posts'; -module.exports = function (Topics) { +export default function (Topics) { const terms = { day: 86400000, week: 604800000, diff --git a/src/topics/scheduled.ts b/src/topics/scheduled.ts index 56c363db39..901e098551 100644 --- a/src/topics/scheduled.ts +++ b/src/topics/scheduled.ts @@ -1,16 +1,15 @@ 'use strict'; -const _ = require('lodash'); -const winston = require('winston'); -const { CronJob } = require('cron'); +import _ from 'lodash'; +import winston from 'winston'; +import { CronJob } from 'cron'; +import db from '../database'; +import posts from '../posts'; +import socketHelpers from '../socket.io/helpers'; +import topics from './index'; +import user from '../user'; -const db = require('../database'); -const posts = require('../posts'); -const socketHelpers = require('../socket.io/helpers'); -const topics = require('./index'); -const user = require('../user'); - -const Scheduled = module.exports; +const Scheduled = {} as any; Scheduled.startJobs = function () { winston.verbose('[scheduled topics] Starting jobs.'); @@ -114,7 +113,7 @@ async function updateUserLastposttimes(uids, topicsData) { tstampByUid[tD.uid] = tstampByUid[tD.uid] ? tstampByUid[tD.uid].concat(tD.lastposttime) : [tD.lastposttime]; }); tstampByUid = Object.fromEntries( - Object.entries(tstampByUid).map(uidTimestamp => [uidTimestamp[0], Math.max(...uidTimestamp[1])]) + Object.entries(tstampByUid).map((uidTimestamp: any) => [uidTimestamp[0], Math.max(...uidTimestamp[1])]) ); const uidsToUpdate = uids.filter((uid, idx) => tstampByUid[uid] > lastposttimes[idx]); @@ -126,3 +125,5 @@ async function shiftPostTimes(tid, timestamp) { // Leaving other related score values intact, since they reflect post order correctly, and it seems that's good enough return db.setObjectBulk(pids.map((pid, idx) => [`post:${pid}`, { timestamp: timestamp + idx + 1 }])); } + +export default Scheduled; \ No newline at end of file diff --git a/src/topics/sorted.ts b/src/topics/sorted.ts index af2cd344cb..1781a8571c 100644 --- a/src/topics/sorted.ts +++ b/src/topics/sorted.ts @@ -1,22 +1,21 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import privileges from '../privileges'; +import user from '../user'; +import categories from '../categories'; +import meta from '../meta'; +import plugins from '../plugins'; -const db = require('../database'); -const privileges = require('../privileges'); -const user = require('../user'); -const categories = require('../categories'); -const meta = require('../meta'); -const plugins = require('../plugins'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.getSortedTopics = async function (params) { const data = { nextStart: 0, topicCount: 0, topics: [], - }; + } as any; params.term = params.term || 'alltime'; params.sort = params.sort || 'recent'; diff --git a/src/topics/suggested.ts b/src/topics/suggested.ts index f62869cf84..9aa3881734 100644 --- a/src/topics/suggested.ts +++ b/src/topics/suggested.ts @@ -1,14 +1,13 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import user from '../user'; +import privileges from '../privileges'; +import search from '../search'; -const db = require('../database'); -const user = require('../user'); -const privileges = require('../privileges'); -const search = require('../search'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.getSuggestedTopics = async function (tid, uid, start, stop, cutoff = 0) { let tids; tid = parseInt(tid, 10); diff --git a/src/topics/tags.ts b/src/topics/tags.ts index 655c18345f..c7e44645c1 100644 --- a/src/topics/tags.ts +++ b/src/topics/tags.ts @@ -1,20 +1,19 @@ 'use strict'; -const async = require('async'); -const validator = require('validator'); -const _ = require('lodash'); +import async from 'async'; +import validator from 'validator'; +import _ from 'lodash'; +import db from '../database'; +import meta from '../meta'; +import user from '../user'; +import categories from '../categories'; +import plugins from '../plugins'; +import utils from '../utils'; +import * as batch from '../batch'; +import cache from '../cache'; -const db = require('../database'); -const meta = require('../meta'); -const user = require('../user'); -const categories = require('../categories'); -const plugins = require('../plugins'); -const utils = require('../utils'); -const batch = require('../batch'); -const cache = require('../cache'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.createTags = async function (tags, tid, timestamp) { if (!Array.isArray(tags) || !tags.length) { return; diff --git a/src/topics/teaser.ts b/src/topics/teaser.ts index 1ebf1d2fb1..f5ece46df8 100644 --- a/src/topics/teaser.ts +++ b/src/topics/teaser.ts @@ -1,16 +1,15 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; +import db from '../database'; +import meta from '../meta'; +import user from '../user'; +import posts from '../posts'; +import plugins from '../plugins'; +import utils from '../utils'; -const db = require('../database'); -const meta = require('../meta'); -const user = require('../user'); -const posts = require('../posts'); -const plugins = require('../plugins'); -const utils = require('../utils'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.getTeasers = async function (topics, options) { if (!Array.isArray(topics) || !topics.length) { return []; @@ -172,3 +171,4 @@ module.exports = function (Topics) { } }; }; + diff --git a/src/topics/thumbs.ts b/src/topics/thumbs.ts index f2bacf74d3..0c1321f27b 100644 --- a/src/topics/thumbs.ts +++ b/src/topics/thumbs.ts @@ -1,19 +1,20 @@ 'use strict'; -const _ = require('lodash'); -const nconf = require('nconf'); -const path = require('path'); -const validator = require('validator'); +import _ from 'lodash'; +import nconf from 'nconf'; +import path from 'path'; +import validator from 'validator'; +import db from '../database'; +import file from '../file'; +import plugins from '../plugins'; +import posts from '../posts'; +import meta from '../meta'; +import cache from '../cache'; +import topics from '.'; -const db = require('../database'); -const file = require('../file'); -const plugins = require('../plugins'); -const posts = require('../posts'); -const meta = require('../meta'); -const cache = require('../cache'); -const Thumbs = module.exports; +const Thumbs = {} as any; Thumbs.exists = async function (id, path) { const isDraft = validator.isUUID(String(id)); @@ -80,7 +81,6 @@ Thumbs.associate = async function ({ id, path, score }) { if (isLocal) { path = path.replace(nconf.get('upload_path'), ''); } - const topics = require('.'); await db.sortedSetAdd(set, isFinite(score) ? score : numThumbs, path); if (!isDraft) { const numThumbs = await db.sortedSetCard(set); @@ -143,7 +143,6 @@ Thumbs.delete = async function (id, relativePaths) { } if (toRemove.length && !isDraft) { - const topics = require('.'); const mainPid = (await topics.getMainPids([id]))[0]; await Promise.all([ @@ -160,3 +159,5 @@ Thumbs.deleteAll = async (id) => { const thumbs = await db.getSortedSetRange(set, 0, -1); await Thumbs.delete(id, thumbs); }; + +export default Thumbs; \ No newline at end of file diff --git a/src/topics/tools.ts b/src/topics/tools.ts index 887f166247..a1f6a5a184 100644 --- a/src/topics/tools.ts +++ b/src/topics/tools.ts @@ -1,18 +1,17 @@ 'use strict'; -const _ = require('lodash'); - -const db = require('../database'); -const topics = require('.'); -const categories = require('../categories'); -const user = require('../user'); -const plugins = require('../plugins'); -const privileges = require('../privileges'); -const utils = require('../utils'); +import _ from 'lodash'; +import db from '../database'; +import topics from '.'; +import categories from '../categories'; +import user from '../user'; +import plugins from '../plugins'; +import privileges from '../privileges'; +import utils from '../utils'; -module.exports = function (Topics) { - const topicTools = {}; +export default function (Topics) { + const topicTools = {} as any; Topics.tools = topicTools; topicTools.delete = async function (tid, uid) { diff --git a/src/topics/unread.ts b/src/topics/unread.ts index ff07c3c5a8..103a7ede8b 100644 --- a/src/topics/unread.ts +++ b/src/topics/unread.ts @@ -1,20 +1,19 @@ 'use strict'; -const async = require('async'); -const _ = require('lodash'); +import async from 'async'; +import _ from 'lodash'; +import db from '../database'; +import user from '../user'; +import posts from '../posts'; +import notifications from '../notifications'; +import categories from '../categories'; +import privileges from '../privileges'; +import meta from '../meta'; +import utils from '../utils'; +import plugins from '../plugins'; -const db = require('../database'); -const user = require('../user'); -const posts = require('../posts'); -const notifications = require('../notifications'); -const categories = require('../categories'); -const privileges = require('../privileges'); -const meta = require('../meta'); -const utils = require('../utils'); -const plugins = require('../plugins'); - -module.exports = function (Topics) { +export default function (Topics) { Topics.getTotalUnread = async function (uid, filter) { filter = filter || ''; const counts = await Topics.getUnreadTids({ cid: 0, uid: uid, count: true }); @@ -26,7 +25,7 @@ module.exports = function (Topics) { showSelect: true, nextStart: 0, topics: [], - }; + } as any; let tids = await Topics.getUnreadTids(params); unreadTopics.topicCount = tids.length; diff --git a/src/topics/user.ts b/src/topics/user.ts index d3fbdc91ef..05e1cb1f76 100644 --- a/src/topics/user.ts +++ b/src/topics/user.ts @@ -1,8 +1,8 @@ 'use strict'; -const db = require('../database'); +import db from '../database'; -module.exports = function (Topics) { +export default function (Topics) { Topics.isOwner = async function (tid, uid) { uid = parseInt(uid, 10); if (uid <= 0) { diff --git a/src/translator.ts b/src/translator.ts index 872349a4aa..4e1ec7308c 100644 --- a/src/translator.ts +++ b/src/translator.ts @@ -1,12 +1,15 @@ 'use strict'; -const winston = require('winston'); +import winston from 'winston'; +import languages from './languages'; +//@ts-ignore +import translator from '../../public/src/modules/translator.common'; +import utils from './utils'; function warn(msg) { winston.warn(msg); } -module.exports = require('../public/src/modules/translator.common')(require('./utils'), (lang, namespace) => { - const languages = require('./languages'); - return languages.get(lang, namespace); -}, warn); +export default translator(utils, (lang, namespace) => languages.get(lang, namespace), warn); + + diff --git a/src/upgrade.ts b/src/upgrade.ts index edea5a51ff..b3a97ab9b5 100644 --- a/src/upgrade.ts +++ b/src/upgrade.ts @@ -1,17 +1,18 @@ 'use strict'; -const path = require('path'); -const util = require('util'); -const semver = require('semver'); -const readline = require('readline'); -const winston = require('winston'); -const chalk = require('chalk'); +import path from 'path'; +import util from 'util'; +import semver from 'semver'; +import readline from 'readline'; +import winston from 'winston'; +import chalk from 'chalk'; -const plugins = require('./plugins'); -const db = require('./database'); -const file = require('./file'); -const { paths } = require('./constants'); +import plugins from './plugins'; +import db from './database'; + +import file from './file'; +import { paths } from './constants'; /* * Need to write an upgrade script for NodeBB? Cool. * @@ -21,7 +22,7 @@ const { paths } = require('./constants'); * 3. Add your script under the "method" property */ -const Upgrade = module.exports; +const Upgrade = {} as any; Upgrade.getAll = async function () { let files = await file.walk(path.join(__dirname, './upgrades')); @@ -71,8 +72,7 @@ Upgrade.appendPluginScripts = async function (files) { files.push(path.join(path.dirname(configPath), script)); }); } - } catch (e) { - if (e.code !== 'MODULE_NOT_FOUND') { + } catch (e: any) { if (e.code !== 'MODULE_NOT_FOUND') { winston.error(e.stack); } } @@ -139,11 +139,11 @@ Upgrade.process = async function (files, skipCount) { date: date, }; - process.stdout.write(`${chalk.white(' → ') + chalk.gray(`[${[date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/')}] `) + scriptExport.name}...`); + (process as any).stdout.write(`${chalk.white(' → ') + chalk.gray(`[${[date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/')}] `) + scriptExport.name}...`); // For backwards compatibility, cross-reference with schemaDate (if found). If a script's date is older, skip it if ((!schemaDate && !schemaLogCount) || (scriptExport.timestamp <= schemaDate && semver.lt(version, '1.5.0'))) { - process.stdout.write(chalk.grey(' skipped\n')); + (process as any).stdout.write(chalk.grey(' skipped\n')); await db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js')); // eslint-disable-next-line no-continue @@ -161,12 +161,12 @@ Upgrade.process = async function (files, skipCount) { await scriptExport.method.bind({ progress: progress, })(); - } catch (err) { + } catch (err: any) { console.error('Error occurred'); throw err; } const upgradeDuration = ((Date.now() - upgradeStart) / 1000).toFixed(2); - process.stdout.write(chalk.green(` OK (${upgradeDuration} seconds)\n`)); + (process as any).stdout.write(chalk.green(` OK (${upgradeDuration} seconds)\n`)); // Record success in schemaLog await db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js')); @@ -178,7 +178,7 @@ Upgrade.process = async function (files, skipCount) { Upgrade.incrementProgress = function (value) { // Newline on first invocation if (this.current === 0) { - process.stdout.write('\n'); + (process as any).stdout.write('\n'); } this.current += value || 1; @@ -187,7 +187,7 @@ Upgrade.incrementProgress = function (value) { if (this.counter > step || this.current >= this.total) { this.counter -= step; - let percentage = 0; + let percentage: number | string = 0; let filled = 0; let unfilled = 15; if (this.total) { @@ -196,9 +196,12 @@ Upgrade.incrementProgress = function (value) { unfilled = Math.max(0, 15 - filled); } - readline.cursorTo(process.stdout, 0); - process.stdout.write(` [${filled ? new Array(filled).join('#') : ''}${new Array(unfilled).join(' ')}] (${this.current}/${this.total || '??'}) ${percentage} `); + readline.cursorTo((process as any).stdout, 0); + (process as any).stdout.write(` [${filled ? new Array(filled).join('#') : ''}${new Array(unfilled).join(' ')}] (${this.current}/${this.total || '??'}) ${percentage} `); } }; -require('./promisify')(Upgrade); +import promisify from './promisify'; +promisify(Upgrade); + +export default Upgrade; \ No newline at end of file diff --git a/src/upgrades/1.0.0/chat_room_hashes.ts b/src/upgrades/1.0.0/chat_room_hashes.ts index 78de201a85..a7714430cc 100644 --- a/src/upgrades/1.0.0/chat_room_hashes.ts +++ b/src/upgrades/1.0.0/chat_room_hashes.ts @@ -1,10 +1,10 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); +import async from 'async'; +import db from '../../database'; -module.exports = { +export const obj = { name: 'Chat room hashes', timestamp: Date.UTC(2015, 11, 23), method: function (callback) { diff --git a/src/upgrades/1.0.0/chat_upgrade.ts b/src/upgrades/1.0.0/chat_upgrade.ts index d4567bffff..c12f34ddc8 100644 --- a/src/upgrades/1.0.0/chat_upgrade.ts +++ b/src/upgrades/1.0.0/chat_upgrade.ts @@ -1,11 +1,11 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; -module.exports = { +export const obj = { name: 'Upgrading chats', timestamp: Date.UTC(2015, 11, 15), method: function (callback) { diff --git a/src/upgrades/1.0.0/global_moderators.ts b/src/upgrades/1.0.0/global_moderators.ts index 2152bdcfc7..be039fe603 100644 --- a/src/upgrades/1.0.0/global_moderators.ts +++ b/src/upgrades/1.0.0/global_moderators.ts @@ -1,10 +1,12 @@ 'use strict'; -module.exports = { +import groups from '../../groups'; + + +export const obj = { name: 'Creating Global moderators group', timestamp: Date.UTC(2016, 0, 23), method: async function () { - const groups = require('../../groups'); const exists = await groups.exists('Global Moderators'); if (exists) { return; diff --git a/src/upgrades/1.0.0/social_post_sharing.ts b/src/upgrades/1.0.0/social_post_sharing.ts index 98d3de7ed8..67aa80a4db 100644 --- a/src/upgrades/1.0.0/social_post_sharing.ts +++ b/src/upgrades/1.0.0/social_post_sharing.ts @@ -1,14 +1,13 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); +import async from 'async'; +import db from '../../database'; +import social from '../../social'; - -module.exports = { +export const obj = { name: 'Social: Post Sharing', timestamp: Date.UTC(2016, 1, 25), method: function (callback) { - const social = require('../../social'); async.parallel([ function (next) { social.setActivePostSharingNetworks(['facebook', 'google', 'twitter'], next); diff --git a/src/upgrades/1.0.0/theme_to_active_plugins.ts b/src/upgrades/1.0.0/theme_to_active_plugins.ts index 35f5b5865c..dc0756edac 100644 --- a/src/upgrades/1.0.0/theme_to_active_plugins.ts +++ b/src/upgrades/1.0.0/theme_to_active_plugins.ts @@ -1,9 +1,9 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { +export const obj = { name: 'Adding theme to active plugins sorted set', timestamp: Date.UTC(2015, 11, 23), method: async function () { diff --git a/src/upgrades/1.0.0/user_best_posts.ts b/src/upgrades/1.0.0/user_best_posts.ts index b391e625fd..81a28b4d8b 100644 --- a/src/upgrades/1.0.0/user_best_posts.ts +++ b/src/upgrades/1.0.0/user_best_posts.ts @@ -1,15 +1,16 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { + +export const obj = { name: 'Creating user best post sorted sets', timestamp: Date.UTC(2016, 0, 14), method: function (callback) { - const batch = require('../../batch'); const { progress } = this; batch.processSortedSet('posts:pid', (ids, next) => { diff --git a/src/upgrades/1.0.0/users_notvalidated.ts b/src/upgrades/1.0.0/users_notvalidated.ts index e8a7c8d318..bd18df1c4d 100644 --- a/src/upgrades/1.0.0/users_notvalidated.ts +++ b/src/upgrades/1.0.0/users_notvalidated.ts @@ -1,15 +1,16 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { + +export const obj = { name: 'Creating users:notvalidated', timestamp: Date.UTC(2016, 0, 20), method: function (callback) { - const batch = require('../../batch'); const now = Date.now(); batch.processSortedSet('users:joindate', (ids, next) => { async.eachSeries(ids, (id, next) => { diff --git a/src/upgrades/1.1.0/assign_topic_read_privilege.ts b/src/upgrades/1.1.0/assign_topic_read_privilege.ts index 94c405cc83..963bac7806 100644 --- a/src/upgrades/1.1.0/assign_topic_read_privilege.ts +++ b/src/upgrades/1.1.0/assign_topic_read_privilege.ts @@ -2,15 +2,15 @@ 'use strict'; -const winston = require('winston'); -const db = require('../../database'); +import winston from 'winston'; +import db from '../../database'; +import groupsAPI from '../../groups'; +import privilegesAPI from '../../privileges'; -module.exports = { +export const obj = { name: 'Giving topics:read privs to any group/user that was previously allowed to Find & Access Category', timestamp: Date.UTC(2016, 4, 28), method: async function () { - const groupsAPI = require('../../groups'); - const privilegesAPI = require('../../privileges'); const cids = await db.getSortedSetRange('categories:cid', 0, -1); for (const cid of cids) { diff --git a/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.ts b/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.ts index 0fa43b9090..22fa50b09e 100644 --- a/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.ts +++ b/src/upgrades/1.1.0/dismiss_flags_from_deleted_topics.ts @@ -1,16 +1,15 @@ 'use strict'; -const winston = require('winston'); -const db = require('../../database'); +import winston from 'winston'; +import db from '../../database'; +import posts from '../../posts'; +import topics from '../../topics'; -module.exports = { +export const obj = { name: 'Dismiss flags from deleted topics', timestamp: Date.UTC(2016, 3, 29), method: async function () { - const posts = require('../../posts'); - const topics = require('../../topics'); - const pids = await db.getSortedSetRange('posts:flagged', 0, -1); const postData = await posts.getPostsFields(pids, ['tid']); const tids = postData.map(t => t.tid); diff --git a/src/upgrades/1.1.0/group_title_update.ts b/src/upgrades/1.1.0/group_title_update.ts index 2db036c17f..6b56a1cb2a 100644 --- a/src/upgrades/1.1.0/group_title_update.ts +++ b/src/upgrades/1.1.0/group_title_update.ts @@ -1,16 +1,17 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import user from '../../user'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Group title from settings to user profile', timestamp: Date.UTC(2016, 3, 14), method: function (callback) { - const user = require('../../user'); - const batch = require('../../batch'); + let count = 0; batch.processSortedSet('users:joindate', (uids, next) => { winston.verbose(`upgraded ${count} users`); diff --git a/src/upgrades/1.1.0/separate_upvote_downvote.ts b/src/upgrades/1.1.0/separate_upvote_downvote.ts index db6cf878d4..c3fcd6bdfa 100644 --- a/src/upgrades/1.1.0/separate_upvote_downvote.ts +++ b/src/upgrades/1.1.0/separate_upvote_downvote.ts @@ -1,16 +1,17 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import * as batch from '../../batch'; +import posts from '../../posts'; -module.exports = { +export const obj = { name: 'Store upvotes/downvotes separately', timestamp: Date.UTC(2016, 5, 13), method: function (callback) { - const batch = require('../../batch'); - const posts = require('../../posts'); + let count = 0; const { progress } = this; @@ -29,7 +30,7 @@ module.exports = { if (err) { return next(err); } - const data = {}; + const data = {} as any; if (parseInt(results.upvotes, 10) > 0) { data.upvotes = results.upvotes; diff --git a/src/upgrades/1.1.0/user_post_count_per_tid.ts b/src/upgrades/1.1.0/user_post_count_per_tid.ts index b6e31f3307..741a3911bf 100644 --- a/src/upgrades/1.1.0/user_post_count_per_tid.ts +++ b/src/upgrades/1.1.0/user_post_count_per_tid.ts @@ -1,16 +1,16 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import * as batch from '../../batch'; +import topics from '../../topics'; -module.exports = { +export const obj = { name: 'Users post count per tid', timestamp: Date.UTC(2016, 3, 19), method: function (callback) { - const batch = require('../../batch'); - const topics = require('../../topics'); let count = 0; batch.processSortedSet('topics:tid', (tids, next) => { winston.verbose(`upgraded ${count} topics`); diff --git a/src/upgrades/1.1.1/remove_negative_best_posts.ts b/src/upgrades/1.1.1/remove_negative_best_posts.ts index d1a8a479cf..f100f150d6 100644 --- a/src/upgrades/1.1.1/remove_negative_best_posts.ts +++ b/src/upgrades/1.1.1/remove_negative_best_posts.ts @@ -1,15 +1,15 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Removing best posts with negative scores', timestamp: Date.UTC(2016, 7, 5), method: function (callback) { - const batch = require('../../batch'); batch.processSortedSet('users:joindate', (ids, next) => { async.each(ids, (id, next) => { winston.verbose(`processing uid ${id}`); diff --git a/src/upgrades/1.1.1/upload_privileges.ts b/src/upgrades/1.1.1/upload_privileges.ts index d343f4ebfa..f5e6be8cfb 100644 --- a/src/upgrades/1.1.1/upload_privileges.ts +++ b/src/upgrades/1.1.1/upload_privileges.ts @@ -1,15 +1,17 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); +import async from 'async'; +import db from '../../database'; -module.exports = { +import privilegesAPI from '../../privileges'; +import meta from '../../meta'; + + +export const obj = { name: 'Giving upload privileges', timestamp: Date.UTC(2016, 6, 12), method: function (callback) { - const privilegesAPI = require('../../privileges'); - const meta = require('../../meta'); db.getSortedSetRange('categories:cid', 0, -1, (err, cids) => { if (err) { diff --git a/src/upgrades/1.10.0/hash_recent_ip_addresses.ts b/src/upgrades/1.10.0/hash_recent_ip_addresses.ts index af210fe326..5c191751aa 100644 --- a/src/upgrades/1.10.0/hash_recent_ip_addresses.ts +++ b/src/upgrades/1.10.0/hash_recent_ip_addresses.ts @@ -1,13 +1,19 @@ 'use strict'; -const async = require('async'); -const crypto = require('crypto'); -const nconf = require('nconf'); -const batch = require('../../batch'); -const db = require('../../database'); +import async from 'async'; +import crypto from 'crypto'; -module.exports = { + +import nconf from 'nconf'; +import * as batch from '../../batch'; + + +import db from '../../database'; + + + +export const obj = { name: 'Hash all IP addresses stored in Recent IPs zset', timestamp: Date.UTC(2018, 5, 22), method: function (callback) { diff --git a/src/upgrades/1.10.0/post_history_privilege.ts b/src/upgrades/1.10.0/post_history_privilege.ts index fb4600d705..b111266f27 100644 --- a/src/upgrades/1.10.0/post_history_privilege.ts +++ b/src/upgrades/1.10.0/post_history_privilege.ts @@ -1,12 +1,16 @@ 'use strict'; -const async = require('async'); +import async from 'async'; -const privileges = require('../../privileges'); -const db = require('../../database'); +import privileges from '../../privileges'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Give post history viewing privilege to registered-users on all categories', timestamp: Date.UTC(2018, 5, 7), method: function (callback) { diff --git a/src/upgrades/1.10.0/search_privileges.ts b/src/upgrades/1.10.0/search_privileges.ts index f5576e818b..f519d75701 100644 --- a/src/upgrades/1.10.0/search_privileges.ts +++ b/src/upgrades/1.10.0/search_privileges.ts @@ -1,11 +1,12 @@ 'use strict'; -module.exports = { +import meta from '../../meta'; +import privileges from '../../privileges'; + +export const obj = { name: 'Give global search privileges', timestamp: Date.UTC(2018, 4, 28), method: async function () { - const meta = require('../../meta'); - const privileges = require('../../privileges'); const allowGuestSearching = parseInt(meta.config.allowGuestSearching, 10) === 1; const allowGuestUserSearching = parseInt(meta.config.allowGuestUserSearching, 10) === 1; diff --git a/src/upgrades/1.10.0/view_deleted_privilege.ts b/src/upgrades/1.10.0/view_deleted_privilege.ts index a483bcf417..b97d58f13b 100644 --- a/src/upgrades/1.10.0/view_deleted_privilege.ts +++ b/src/upgrades/1.10.0/view_deleted_privilege.ts @@ -2,10 +2,10 @@ 'use strict'; -const groups = require('../../groups'); -const db = require('../../database'); +import groups from '../../groups'; +import db from '../../database'; -module.exports = { +export const obj = { name: 'Give deleted post viewing privilege to moderators on all categories', timestamp: Date.UTC(2018, 5, 8), method: async function () { diff --git a/src/upgrades/1.10.2/event_filters.ts b/src/upgrades/1.10.2/event_filters.ts index cf2709a5ab..b5ec3c6c1b 100644 --- a/src/upgrades/1.10.2/event_filters.ts +++ b/src/upgrades/1.10.2/event_filters.ts @@ -2,11 +2,15 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -const batch = require('../../batch'); -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'add filters to events', timestamp: Date.UTC(2018, 9, 4), method: async function () { diff --git a/src/upgrades/1.10.2/fix_category_post_zsets.ts b/src/upgrades/1.10.2/fix_category_post_zsets.ts index 8a21638341..66817fd2c3 100644 --- a/src/upgrades/1.10.2/fix_category_post_zsets.ts +++ b/src/upgrades/1.10.2/fix_category_post_zsets.ts @@ -1,11 +1,15 @@ 'use strict'; -const db = require('../../database'); -const posts = require('../../posts'); -const topics = require('../../topics'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import posts from '../../posts'; +import topics from '../../topics'; +import * as batch from '../../batch'; + + + +export const obj = { name: 'Fix category post zsets', timestamp: Date.UTC(2018, 9, 10), method: async function () { diff --git a/src/upgrades/1.10.2/fix_category_topic_zsets.ts b/src/upgrades/1.10.2/fix_category_topic_zsets.ts index 999383feac..82fc397dfe 100644 --- a/src/upgrades/1.10.2/fix_category_topic_zsets.ts +++ b/src/upgrades/1.10.2/fix_category_topic_zsets.ts @@ -2,17 +2,21 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -const batch = require('../../batch'); -module.exports = { + +import * as batch from '../../batch'; +import topics from '../../topics'; + + + +export const obj = { name: 'Fix category topic zsets', timestamp: Date.UTC(2018, 9, 11), method: async function () { const { progress } = this; - const topics = require('../../topics'); await batch.processSortedSet('topics:tid', async (tids) => { for (const tid of tids) { progress.incr(); diff --git a/src/upgrades/1.10.2/local_login_privileges.ts b/src/upgrades/1.10.2/local_login_privileges.ts index 0415ee1ae3..a6c2d57673 100644 --- a/src/upgrades/1.10.2/local_login_privileges.ts +++ b/src/upgrades/1.10.2/local_login_privileges.ts @@ -1,11 +1,12 @@ 'use strict'; -module.exports = { +import meta from '../../meta'; +import privileges from '../../privileges'; + +export const obj = { name: 'Give global local login privileges', timestamp: Date.UTC(2018, 8, 28), method: function (callback) { - const meta = require('../../meta'); - const privileges = require('../../privileges'); const allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) !== 0; if (allowLocalLogin) { diff --git a/src/upgrades/1.10.2/postgres_sessions.ts b/src/upgrades/1.10.2/postgres_sessions.ts index d5c18fa726..08d8b79ddf 100644 --- a/src/upgrades/1.10.2/postgres_sessions.ts +++ b/src/upgrades/1.10.2/postgres_sessions.ts @@ -1,9 +1,11 @@ 'use strict'; -const nconf = require('nconf'); -const db = require('../../database'); +import nconf from 'nconf'; +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Optimize PostgreSQL sessions', timestamp: Date.UTC(2018, 9, 1), method: function (callback) { diff --git a/src/upgrades/1.10.2/upgrade_bans_to_hashes.ts b/src/upgrades/1.10.2/upgrade_bans_to_hashes.ts index 84c7a0ed4d..1e9c2b2b8e 100644 --- a/src/upgrades/1.10.2/upgrade_bans_to_hashes.ts +++ b/src/upgrades/1.10.2/upgrade_bans_to_hashes.ts @@ -2,10 +2,14 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Upgrade bans to hashes', timestamp: Date.UTC(2018, 8, 24), method: async function () { @@ -39,7 +43,7 @@ module.exports = { uid: uid, timestamp: ban.score, expire: parseInt(ban.value, 10), - }; + } as any; if (reasonData) { data.reason = reasonData.value; } diff --git a/src/upgrades/1.10.2/username_email_history.ts b/src/upgrades/1.10.2/username_email_history.ts index 3b03568a69..716eea399d 100644 --- a/src/upgrades/1.10.2/username_email_history.ts +++ b/src/upgrades/1.10.2/username_email_history.ts @@ -1,11 +1,15 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -const batch = require('../../batch'); -const user = require('../../user'); -module.exports = { + +import * as batch from '../../batch'; + + +import user from '../../user'; + +export const obj = { name: 'Record first entry in username/email history', timestamp: Date.UTC(2018, 7, 28), method: async function () { diff --git a/src/upgrades/1.11.0/navigation_visibility_groups.ts b/src/upgrades/1.11.0/navigation_visibility_groups.ts index 4e3730b9cb..7cab9fddd4 100644 --- a/src/upgrades/1.11.0/navigation_visibility_groups.ts +++ b/src/upgrades/1.11.0/navigation_visibility_groups.ts @@ -1,6 +1,8 @@ 'use strict'; +import db from '../../database'; +import translator from '../../translator'; -module.exports = { +export const obj = { name: 'Navigation item visibility groups', timestamp: Date.UTC(2018, 10, 10), method: async function () { @@ -27,7 +29,6 @@ module.exports = { // use navigation.get/save as it was in 1.11.0 so upgrade script doesn't crash on latest nbb // see https://github.com/NodeBB/NodeBB/pull/11013 async function navigationAdminGet() { - const db = require('../../database'); const data = await db.getSortedSetRange('navigation:enabled', 0, -1); return data.filter(Boolean).map((item) => { item = JSON.parse(item); @@ -40,8 +41,6 @@ async function navigationAdminGet() { } async function navigationAdminSave(data) { - const db = require('../../database'); - const translator = require('../../translator'); const order = Object.keys(data); const items = data.map((item, index) => { Object.keys(item).forEach((key) => { diff --git a/src/upgrades/1.11.0/resize_image_width.ts b/src/upgrades/1.11.0/resize_image_width.ts index a29a45f4f3..c2b2288e65 100644 --- a/src/upgrades/1.11.0/resize_image_width.ts +++ b/src/upgrades/1.11.0/resize_image_width.ts @@ -1,12 +1,12 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import meta from '../../meta'; -module.exports = { +export const obj = { name: 'Rename maximumImageWidth to resizeImageWidth', timestamp: Date.UTC(2018, 9, 24), method: async function () { - const meta = require('../../meta'); const value = await meta.configs.get('maximumImageWidth'); await meta.configs.set('resizeImageWidth', value); await db.deleteObjectField('config', 'maximumImageWidth'); diff --git a/src/upgrades/1.11.0/widget_visibility_groups.ts b/src/upgrades/1.11.0/widget_visibility_groups.ts index 66ceac8795..4536f6718e 100644 --- a/src/upgrades/1.11.0/widget_visibility_groups.ts +++ b/src/upgrades/1.11.0/widget_visibility_groups.ts @@ -1,11 +1,12 @@ 'use strict'; +import widgetAdmin from '../../widgets/admin'; +import widgets from '../../widgets'; -module.exports = { +export const obj = { name: 'Widget visibility groups', timestamp: Date.UTC(2018, 10, 10), method: async function () { - const widgetAdmin = require('../../widgets/admin'); - const widgets = require('../../widgets'); + const areas = await widgetAdmin.getAreas(); for (const area of areas) { if (area.data.length) { diff --git a/src/upgrades/1.11.1/remove_ignored_cids_per_user.ts b/src/upgrades/1.11.1/remove_ignored_cids_per_user.ts index e94b692a37..65dd186d67 100644 --- a/src/upgrades/1.11.1/remove_ignored_cids_per_user.ts +++ b/src/upgrades/1.11.1/remove_ignored_cids_per_user.ts @@ -1,10 +1,14 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -const batch = require('../../batch'); -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Remove uid::ignored:cids', timestamp: Date.UTC(2018, 11, 11), method: function (callback) { diff --git a/src/upgrades/1.12.0/category_watch_state.ts b/src/upgrades/1.12.0/category_watch_state.ts index 1363d50bc2..ba4ce19944 100644 --- a/src/upgrades/1.12.0/category_watch_state.ts +++ b/src/upgrades/1.12.0/category_watch_state.ts @@ -2,11 +2,15 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); -const categories = require('../../categories'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import categories from '../../categories'; + +export const obj = { name: 'Update category watch data', timestamp: Date.UTC(2018, 11, 13), method: async function () { diff --git a/src/upgrades/1.12.0/global_view_privileges.ts b/src/upgrades/1.12.0/global_view_privileges.ts index b4cdabd226..1cac50f548 100644 --- a/src/upgrades/1.12.0/global_view_privileges.ts +++ b/src/upgrades/1.12.0/global_view_privileges.ts @@ -1,13 +1,17 @@ 'use strict'; -const async = require('async'); -const privileges = require('../../privileges'); +import async from 'async'; +import privileges from '../../privileges'; +import meta from '../../meta'; -module.exports = { + + + +export const obj = { name: 'Global view privileges', timestamp: Date.UTC(2019, 0, 5), method: function (callback) { - const meta = require('../../meta'); + const tasks = [ async.apply(privileges.global.give, ['groups:view:users', 'groups:view:tags', 'groups:view:groups'], 'registered-users'), diff --git a/src/upgrades/1.12.0/group_create_privilege.ts b/src/upgrades/1.12.0/group_create_privilege.ts index 4fad7703a9..7cbaf054f6 100644 --- a/src/upgrades/1.12.0/group_create_privilege.ts +++ b/src/upgrades/1.12.0/group_create_privilege.ts @@ -1,12 +1,16 @@ 'use strict'; -const privileges = require('../../privileges'); +import privileges from '../../privileges'; +import meta from '../../meta'; -module.exports = { + + + +export const obj = { name: 'Group create global privilege', timestamp: Date.UTC(2019, 0, 4), method: function (callback) { - const meta = require('../../meta'); + if (parseInt(meta.config.allowGroupCreation, 10) === 1) { privileges.global.give(['groups:group:create'], 'registered-users', callback); } else { diff --git a/src/upgrades/1.12.1/clear_username_email_history.ts b/src/upgrades/1.12.1/clear_username_email_history.ts index 822b500884..70b2a7f3c8 100644 --- a/src/upgrades/1.12.1/clear_username_email_history.ts +++ b/src/upgrades/1.12.1/clear_username_email_history.ts @@ -1,10 +1,12 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); -const user = require('../../user'); +import async from 'async'; +import db from '../../database'; -module.exports = { + +import user from '../../user'; + +export const obj = { name: 'Delete username email history for deleted users', timestamp: Date.UTC(2019, 2, 25), method: function (callback) { diff --git a/src/upgrades/1.12.1/moderation_notes_refactor.ts b/src/upgrades/1.12.1/moderation_notes_refactor.ts index 390273d74a..05b62d0ff9 100644 --- a/src/upgrades/1.12.1/moderation_notes_refactor.ts +++ b/src/upgrades/1.12.1/moderation_notes_refactor.ts @@ -2,10 +2,14 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Update moderation notes to hashes', timestamp: Date.UTC(2019, 3, 5), method: async function () { diff --git a/src/upgrades/1.12.1/post_upload_sizes.ts b/src/upgrades/1.12.1/post_upload_sizes.ts index 8c545b1657..0cf4581ec7 100644 --- a/src/upgrades/1.12.1/post_upload_sizes.ts +++ b/src/upgrades/1.12.1/post_upload_sizes.ts @@ -1,10 +1,14 @@ 'use strict'; -const batch = require('../../batch'); -const posts = require('../../posts'); -const db = require('../../database'); +import * as batch from '../../batch'; -module.exports = { + +import posts from '../../posts'; +import db from '../../database'; + + + +export const obj = { name: 'Calculate image sizes of all uploaded images', timestamp: Date.UTC(2019, 2, 16), method: async function () { diff --git a/src/upgrades/1.12.3/disable_plugin_metrics.ts b/src/upgrades/1.12.3/disable_plugin_metrics.ts index 666949d8ef..d7e8100903 100644 --- a/src/upgrades/1.12.3/disable_plugin_metrics.ts +++ b/src/upgrades/1.12.3/disable_plugin_metrics.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Disable plugin metrics for existing installs', timestamp: Date.UTC(2019, 4, 21), method: async function (callback) { diff --git a/src/upgrades/1.12.3/give_mod_info_privilege.ts b/src/upgrades/1.12.3/give_mod_info_privilege.ts index e8c51978bb..6bc5078ed9 100644 --- a/src/upgrades/1.12.3/give_mod_info_privilege.ts +++ b/src/upgrades/1.12.3/give_mod_info_privilege.ts @@ -2,11 +2,17 @@ 'use strict'; -const db = require('../../database'); -const privileges = require('../../privileges'); -const groups = require('../../groups'); +import db from '../../database'; -module.exports = { + +import privileges from '../../privileges'; + + +import groups from '../../groups'; + + + +export const obj = { name: 'give mod info privilege', timestamp: Date.UTC(2019, 9, 8), method: async function () { diff --git a/src/upgrades/1.12.3/give_mod_privileges.ts b/src/upgrades/1.12.3/give_mod_privileges.ts index cf7439a16b..a938ded2ba 100644 --- a/src/upgrades/1.12.3/give_mod_privileges.ts +++ b/src/upgrades/1.12.3/give_mod_privileges.ts @@ -2,11 +2,17 @@ 'use strict'; -const privileges = require('../../privileges'); -const groups = require('../../groups'); -const db = require('../../database'); +import privileges from '../../privileges'; -module.exports = { + +import groups from '../../groups'; + + +import db from '../../database'; + + + +export const obj = { name: 'Give mods explicit privileges', timestamp: Date.UTC(2019, 4, 28), method: async function () { diff --git a/src/upgrades/1.12.3/update_registration_type.ts b/src/upgrades/1.12.3/update_registration_type.ts index 8eb5e754d3..eafc938bc4 100644 --- a/src/upgrades/1.12.3/update_registration_type.ts +++ b/src/upgrades/1.12.3/update_registration_type.ts @@ -1,12 +1,16 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import meta from '../../meta'; -module.exports = { + + + +export const obj = { name: 'Update registration type', timestamp: Date.UTC(2019, 5, 4), method: function (callback) { - const meta = require('../../meta'); + const registrationType = meta.config.registrationType || 'normal'; if (registrationType === 'admin-approval' || registrationType === 'admin-approval-ip') { db.setObject('config', { diff --git a/src/upgrades/1.12.3/user_pid_sets.ts b/src/upgrades/1.12.3/user_pid_sets.ts index 543059705e..85b91c6922 100644 --- a/src/upgrades/1.12.3/user_pid_sets.ts +++ b/src/upgrades/1.12.3/user_pid_sets.ts @@ -2,12 +2,16 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); -const posts = require('../../posts'); -const topics = require('../../topics'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import posts from '../../posts'; +import topics from '../../topics'; + +export const obj = { name: 'Create zsets for user posts per category', timestamp: Date.UTC(2019, 5, 23), method: async function () { diff --git a/src/upgrades/1.13.0/clean_flag_byCid.ts b/src/upgrades/1.13.0/clean_flag_byCid.ts index 5e0cc70132..f2db284824 100644 --- a/src/upgrades/1.13.0/clean_flag_byCid.ts +++ b/src/upgrades/1.13.0/clean_flag_byCid.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Clean flag byCid zsets', timestamp: Date.UTC(2019, 8, 24), method: async function () { diff --git a/src/upgrades/1.13.0/clean_post_topic_hash.ts b/src/upgrades/1.13.0/clean_post_topic_hash.ts index caa6dbd8f6..fea463cc8f 100644 --- a/src/upgrades/1.13.0/clean_post_topic_hash.ts +++ b/src/upgrades/1.13.0/clean_post_topic_hash.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Clean up post hash data', timestamp: Date.UTC(2019, 9, 7), method: async function () { diff --git a/src/upgrades/1.13.0/cleanup_old_notifications.ts b/src/upgrades/1.13.0/cleanup_old_notifications.ts index 591c0392cc..8eeb0ef025 100644 --- a/src/upgrades/1.13.0/cleanup_old_notifications.ts +++ b/src/upgrades/1.13.0/cleanup_old_notifications.ts @@ -1,10 +1,14 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); -const user = require('../../user'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import user from '../../user'; + +export const obj = { name: 'Clean up old notifications and hash data', timestamp: Date.UTC(2019, 9, 7), method: async function () { diff --git a/src/upgrades/1.13.3/fix_users_sorted_sets.ts b/src/upgrades/1.13.3/fix_users_sorted_sets.ts index a23955a8da..2b34a8381f 100644 --- a/src/upgrades/1.13.3/fix_users_sorted_sets.ts +++ b/src/upgrades/1.13.3/fix_users_sorted_sets.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Fix user sorted sets', timestamp: Date.UTC(2020, 4, 2), method: async function () { diff --git a/src/upgrades/1.13.4/remove_allowFileUploads_priv.ts b/src/upgrades/1.13.4/remove_allowFileUploads_priv.ts index 894dd398af..37f729f1cd 100644 --- a/src/upgrades/1.13.4/remove_allowFileUploads_priv.ts +++ b/src/upgrades/1.13.4/remove_allowFileUploads_priv.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const privileges = require('../../privileges'); +import db from '../../database'; -module.exports = { + +import privileges from '../../privileges'; + + + +export const obj = { name: 'Removing file upload privilege if file uploads were disabled (`allowFileUploads`)', timestamp: Date.UTC(2020, 4, 21), method: async () => { diff --git a/src/upgrades/1.14.0/fix_category_image_field.ts b/src/upgrades/1.14.0/fix_category_image_field.ts index 036f4063e8..a512edb1cf 100644 --- a/src/upgrades/1.14.0/fix_category_image_field.ts +++ b/src/upgrades/1.14.0/fix_category_image_field.ts @@ -1,12 +1,12 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Remove duplicate image field for categories', timestamp: Date.UTC(2020, 5, 9), method: async () => { - const batch = require('../../batch'); await batch.processSortedSet('categories:cid', async (cids) => { let categoryData = await db.getObjects(cids.map(c => `category:${c}`)); categoryData = categoryData.filter(c => c && (c.image || c.backgroundImage)); diff --git a/src/upgrades/1.14.0/unescape_navigation_titles.ts b/src/upgrades/1.14.0/unescape_navigation_titles.ts index 4db6c00c6f..f9fdb9dfcb 100644 --- a/src/upgrades/1.14.0/unescape_navigation_titles.ts +++ b/src/upgrades/1.14.0/unescape_navigation_titles.ts @@ -1,13 +1,13 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import translator from '../../translator'; -module.exports = { +export const obj = { name: 'Unescape navigation titles', timestamp: Date.UTC(2020, 5, 26), method: async function () { const data = await db.getSortedSetRangeWithScores('navigation:enabled', 0, -1); - const translator = require('../../translator'); const order = []; const items = []; data.forEach((item) => { diff --git a/src/upgrades/1.14.1/readd_deleted_recent_topics.ts b/src/upgrades/1.14.1/readd_deleted_recent_topics.ts index eabd23cc77..a9ac7b0f60 100644 --- a/src/upgrades/1.14.1/readd_deleted_recent_topics.ts +++ b/src/upgrades/1.14.1/readd_deleted_recent_topics.ts @@ -1,10 +1,9 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import * as batch from '../../batch'; -const batch = require('../../batch'); - -module.exports = { +export const obj = { name: 'Re-add deleted topics to topics:recent', timestamp: Date.UTC(2018, 9, 11), method: async function () { diff --git a/src/upgrades/1.15.0/add_target_uid_to_flags.ts b/src/upgrades/1.15.0/add_target_uid_to_flags.ts index 0f9d9cfa83..ebb5461123 100644 --- a/src/upgrades/1.15.0/add_target_uid_to_flags.ts +++ b/src/upgrades/1.15.0/add_target_uid_to_flags.ts @@ -1,10 +1,14 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); -const posts = require('../../posts'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import posts from '../../posts'; + +export const obj = { name: 'Add target uid to flag objects', timestamp: Date.UTC(2020, 7, 22), method: async function () { diff --git a/src/upgrades/1.15.0/consolidate_flags.ts b/src/upgrades/1.15.0/consolidate_flags.ts index 98dccaac23..241b7cb2f5 100644 --- a/src/upgrades/1.15.0/consolidate_flags.ts +++ b/src/upgrades/1.15.0/consolidate_flags.ts @@ -1,11 +1,15 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); -const posts = require('../../posts'); -const user = require('../../user'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import posts from '../../posts'; +import user from '../../user'; + +export const obj = { name: 'Consolidate multiple flags reports, going forward', timestamp: Date.UTC(2020, 6, 16), method: async function () { diff --git a/src/upgrades/1.15.0/disable_sounds_plugin.ts b/src/upgrades/1.15.0/disable_sounds_plugin.ts index f1c754f2d5..f170f03742 100644 --- a/src/upgrades/1.15.0/disable_sounds_plugin.ts +++ b/src/upgrades/1.15.0/disable_sounds_plugin.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Disable nodebb-plugin-soundpack-default', timestamp: Date.UTC(2020, 8, 6), method: async function () { diff --git a/src/upgrades/1.15.0/fix_category_colors.ts b/src/upgrades/1.15.0/fix_category_colors.ts index 4e5288c87a..ce5a457dbf 100644 --- a/src/upgrades/1.15.0/fix_category_colors.ts +++ b/src/upgrades/1.15.0/fix_category_colors.ts @@ -1,12 +1,12 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Fix category colors that are 3 digit hex colors', timestamp: Date.UTC(2020, 9, 11), method: async () => { - const batch = require('../../batch'); await batch.processSortedSet('categories:cid', async (cids) => { let categoryData = await db.getObjects(cids.map(c => `category:${c}`)); categoryData = categoryData.filter(c => c && (c.color === '#fff' || c.color === '#333' || String(c.color).length !== 7)); diff --git a/src/upgrades/1.15.0/fullname_search_set.ts b/src/upgrades/1.15.0/fullname_search_set.ts index e1b335afe8..13e6451aa3 100644 --- a/src/upgrades/1.15.0/fullname_search_set.ts +++ b/src/upgrades/1.15.0/fullname_search_set.ts @@ -1,11 +1,15 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -const batch = require('../../batch'); -const user = require('../../user'); -module.exports = { + +import * as batch from '../../batch'; + + +import user from '../../user'; + +export const obj = { name: 'Create fullname search set', timestamp: Date.UTC(2020, 8, 11), method: async function () { diff --git a/src/upgrades/1.15.0/remove_allow_from_uri.ts b/src/upgrades/1.15.0/remove_allow_from_uri.ts index a336c0336d..20f6053a63 100644 --- a/src/upgrades/1.15.0/remove_allow_from_uri.ts +++ b/src/upgrades/1.15.0/remove_allow_from_uri.ts @@ -1,12 +1,15 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import meta from '../../meta'; -module.exports = { + + + +export const obj = { name: 'Remove allow from uri setting', timestamp: Date.UTC(2020, 8, 6), method: async function () { - const meta = require('../../meta'); if (meta.config['allow-from-uri']) { await db.setObjectField('config', 'csp-frame-ancestors', meta.config['allow-from-uri']); } diff --git a/src/upgrades/1.15.0/remove_flag_reporters_zset.ts b/src/upgrades/1.15.0/remove_flag_reporters_zset.ts index 6ea79e64dd..4cce0eff87 100644 --- a/src/upgrades/1.15.0/remove_flag_reporters_zset.ts +++ b/src/upgrades/1.15.0/remove_flag_reporters_zset.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Remove flag reporters sorted set', timestamp: Date.UTC(2020, 6, 31), method: async function () { diff --git a/src/upgrades/1.15.0/topic_poster_count.ts b/src/upgrades/1.15.0/topic_poster_count.ts index f7d20d4c0d..976a30de2d 100644 --- a/src/upgrades/1.15.0/topic_poster_count.ts +++ b/src/upgrades/1.15.0/topic_poster_count.ts @@ -1,10 +1,14 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -const batch = require('../../batch'); -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Store poster count in topic hash', timestamp: Date.UTC(2020, 9, 24), method: async function () { diff --git a/src/upgrades/1.15.0/track_flags_by_target.ts b/src/upgrades/1.15.0/track_flags_by_target.ts index c96e993365..da4b3001fc 100644 --- a/src/upgrades/1.15.0/track_flags_by_target.ts +++ b/src/upgrades/1.15.0/track_flags_by_target.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'New sorted set for tracking flags by target', timestamp: Date.UTC(2020, 6, 15), method: async () => { diff --git a/src/upgrades/1.15.0/verified_users_group.ts b/src/upgrades/1.15.0/verified_users_group.ts index 1488b8b280..8f5f5cb749 100644 --- a/src/upgrades/1.15.0/verified_users_group.ts +++ b/src/upgrades/1.15.0/verified_users_group.ts @@ -1,15 +1,22 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; + + + +import * as batch from '../../batch'; + + +import user from '../../user'; +import groups from '../../groups'; + + +import meta from '../../meta';import privileges from '../../privileges'; + -const batch = require('../../batch'); -const user = require('../../user'); -const groups = require('../../groups'); -const meta = require('../../meta'); -const privileges = require('../../privileges'); const now = Date.now(); -module.exports = { +export const obj = { name: 'Create verified/unverified user groups', timestamp: Date.UTC(2020, 9, 13), method: async function () { diff --git a/src/upgrades/1.15.4/clear_purged_replies.ts b/src/upgrades/1.15.4/clear_purged_replies.ts index 8b32db239c..b424fb2af0 100644 --- a/src/upgrades/1.15.4/clear_purged_replies.ts +++ b/src/upgrades/1.15.4/clear_purged_replies.ts @@ -1,11 +1,15 @@ 'use strict'; -const _ = require('lodash'); -const db = require('../../database'); +import _ from 'lodash'; +import db from '../../database'; -const batch = require('../../batch'); -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Clear purged replies and toPid', timestamp: Date.UTC(2020, 10, 26), method: async function () { diff --git a/src/upgrades/1.16.0/category_tags.ts b/src/upgrades/1.16.0/category_tags.ts index 2dc7c40484..6330b3d353 100644 --- a/src/upgrades/1.16.0/category_tags.ts +++ b/src/upgrades/1.16.0/category_tags.ts @@ -1,11 +1,15 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); -const batch = require('../../batch'); -const topics = require('../../topics'); +import async from 'async'; +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import topics from '../../topics'; + +export const obj = { name: 'Create category tags sorted sets', timestamp: Date.UTC(2020, 10, 23), method: async function () { diff --git a/src/upgrades/1.16.0/migrate_thumbs.ts b/src/upgrades/1.16.0/migrate_thumbs.ts index 0686af71c1..55a94eb1c5 100644 --- a/src/upgrades/1.16.0/migrate_thumbs.ts +++ b/src/upgrades/1.16.0/migrate_thumbs.ts @@ -1,13 +1,17 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; -const db = require('../../database'); -const meta = require('../../meta'); -const topics = require('../../topics'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import meta from '../../meta'; +import topics from '../../topics'; +import * as batch from '../../batch'; + + + +export const obj = { name: 'Migrate existing topic thumbnails to new format', timestamp: Date.UTC(2020, 11, 11), method: async function () { diff --git a/src/upgrades/1.17.0/banned_users_group.ts b/src/upgrades/1.17.0/banned_users_group.ts index 623725a9ec..79619a0be0 100644 --- a/src/upgrades/1.17.0/banned_users_group.ts +++ b/src/upgrades/1.17.0/banned_users_group.ts @@ -1,12 +1,18 @@ 'use strict'; -const batch = require('../../batch'); -const db = require('../../database'); -const groups = require('../../groups'); +import * as batch from '../../batch'; + + +import db from '../../database'; + + +import groups from '../../groups'; + + const now = Date.now(); -module.exports = { +export const obj = { name: 'Move banned users to banned-users group', timestamp: Date.UTC(2020, 11, 13), method: async function () { diff --git a/src/upgrades/1.17.0/category_name_zset.ts b/src/upgrades/1.17.0/category_name_zset.ts index 245908b6a2..b4b3bc2c41 100644 --- a/src/upgrades/1.17.0/category_name_zset.ts +++ b/src/upgrades/1.17.0/category_name_zset.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Create category name sorted set', timestamp: Date.UTC(2021, 0, 27), method: async function () { diff --git a/src/upgrades/1.17.0/default_favicon.ts b/src/upgrades/1.17.0/default_favicon.ts index 8ebc14dd00..6a4db7b3c4 100644 --- a/src/upgrades/1.17.0/default_favicon.ts +++ b/src/upgrades/1.17.0/default_favicon.ts @@ -1,11 +1,10 @@ 'use strict'; -const nconf = require('nconf'); -const path = require('path'); -const fs = require('fs'); -const file = require('../../file'); +import nconf from 'nconf'; +import path from 'path';import fs from 'fs'; +import file from '../../file'; -module.exports = { +export const obj = { name: 'Store default favicon if it does not exist', timestamp: Date.UTC(2021, 2, 9), method: async function () { diff --git a/src/upgrades/1.17.0/schedule_privilege_for_existing_categories.ts b/src/upgrades/1.17.0/schedule_privilege_for_existing_categories.ts index ae2fef6d9f..e88baf60ba 100644 --- a/src/upgrades/1.17.0/schedule_privilege_for_existing_categories.ts +++ b/src/upgrades/1.17.0/schedule_privilege_for_existing_categories.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const privileges = require('../../privileges'); +import db from '../../database'; -module.exports = { + +import privileges from '../../privileges'; + + + +export const obj = { name: 'Add "schedule" to default privileges of admins and gmods for existing categories', timestamp: Date.UTC(2021, 2, 11), method: async () => { diff --git a/src/upgrades/1.17.0/subcategories_per_page.ts b/src/upgrades/1.17.0/subcategories_per_page.ts index 8323ac0525..840092823a 100644 --- a/src/upgrades/1.17.0/subcategories_per_page.ts +++ b/src/upgrades/1.17.0/subcategories_per_page.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Create subCategoriesPerPage property for categories', timestamp: Date.UTC(2021, 0, 31), method: async function () { diff --git a/src/upgrades/1.17.0/topic_thumb_count.ts b/src/upgrades/1.17.0/topic_thumb_count.ts index 83762612fa..265a6c51af 100644 --- a/src/upgrades/1.17.0/topic_thumb_count.ts +++ b/src/upgrades/1.17.0/topic_thumb_count.ts @@ -1,10 +1,14 @@ 'use strict'; -const _ = require('lodash'); -const db = require('../../database'); -const batch = require('../../batch'); +import _ from 'lodash'; +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Store number of thumbs a topic has in the topic object', timestamp: Date.UTC(2021, 1, 7), method: async function () { diff --git a/src/upgrades/1.18.0/enable_include_unverified_emails.ts b/src/upgrades/1.18.0/enable_include_unverified_emails.ts index b10c496e38..a36acf1f4f 100644 --- a/src/upgrades/1.18.0/enable_include_unverified_emails.ts +++ b/src/upgrades/1.18.0/enable_include_unverified_emails.ts @@ -1,8 +1,7 @@ 'use strict'; -const meta = require('../../meta'); - -module.exports = { +import meta from '../../meta'; +export const obj = { name: 'Enable setting to include unverified emails for all mailings', // remember, month is zero-indexed (so January is 0, December is 11) timestamp: Date.UTC(2021, 5, 18), diff --git a/src/upgrades/1.18.0/topic_tags_refactor.ts b/src/upgrades/1.18.0/topic_tags_refactor.ts index eb895e720b..04d8f191d4 100644 --- a/src/upgrades/1.18.0/topic_tags_refactor.ts +++ b/src/upgrades/1.18.0/topic_tags_refactor.ts @@ -1,9 +1,13 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + + +export const obj = { name: 'Store tags in topic hash', timestamp: Date.UTC(2021, 8, 9), method: async function () { @@ -19,7 +23,7 @@ module.exports = { const tags = await getTopicsTags(tids); const topicsWithTags = tids.map((tid, i) => { - const topic = { tid: tid }; + const topic = { tid: tid } as any; topic.tags = tags[i]; return topic; }).filter(t => t && t.tags.length); diff --git a/src/upgrades/1.18.4/category_topics_views.ts b/src/upgrades/1.18.4/category_topics_views.ts index c2d78fbf9e..a09529a463 100644 --- a/src/upgrades/1.18.4/category_topics_views.ts +++ b/src/upgrades/1.18.4/category_topics_views.ts @@ -1,10 +1,14 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); -const topics = require('../../topics'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import topics from '../../topics'; + +export const obj = { name: 'Category topics sorted sets by views', timestamp: Date.UTC(2021, 8, 28), method: async function () { diff --git a/src/upgrades/1.19.0/navigation-enabled-hashes.ts b/src/upgrades/1.19.0/navigation-enabled-hashes.ts index a8a7297332..26ae26720d 100644 --- a/src/upgrades/1.19.0/navigation-enabled-hashes.ts +++ b/src/upgrades/1.19.0/navigation-enabled-hashes.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Upgrade navigation items to hashes', timestamp: Date.UTC(2021, 11, 13), method: async function () { diff --git a/src/upgrades/1.19.0/reenable-username-login.ts b/src/upgrades/1.19.0/reenable-username-login.ts index d4d88abd5b..0db9fde181 100644 --- a/src/upgrades/1.19.0/reenable-username-login.ts +++ b/src/upgrades/1.19.0/reenable-username-login.ts @@ -1,8 +1,8 @@ 'use strict'; -const meta = require('../../meta'); +import meta from '../../meta'; -module.exports = { +export const obj = { name: 'Re-enable username login', timestamp: Date.UTC(2021, 10, 23), method: async () => { diff --git a/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.ts b/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.ts index c73aa51a1f..d57af33774 100644 --- a/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.ts +++ b/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.ts @@ -1,14 +1,18 @@ 'use strict'; -const path = require('path'); -const fs = require('fs').promises; -const nconf = require('nconf'); +import path from 'path'; +import { promises as fs } from 'fs'; +import nconf from 'nconf'; -const db = require('../../database'); -const batch = require('../../batch'); -const file = require('../../file'); +import db from '../../database'; -module.exports = { + +import * as batch from '../../batch'; + + +import file from '../../file'; + +export const obj = { name: 'Clean up leftover topic thumb sorted sets and files for since-purged topics', timestamp: Date.UTC(2022, 1, 7), method: async function () { diff --git a/src/upgrades/1.19.2/store_downvoted_posts_in_zset.ts b/src/upgrades/1.19.2/store_downvoted_posts_in_zset.ts index 2ee7aa3dcc..fc12225e36 100644 --- a/src/upgrades/1.19.2/store_downvoted_posts_in_zset.ts +++ b/src/upgrades/1.19.2/store_downvoted_posts_in_zset.ts @@ -1,13 +1,16 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import * as batch from '../../batch'; +import posts from '../../posts'; -module.exports = { + + +export const obj = { name: 'Store downvoted posts in user votes sorted set', timestamp: Date.UTC(2022, 1, 4), method: async function () { - const batch = require('../../batch'); - const posts = require('../../posts'); + const { progress } = this; await batch.processSortedSet('posts:pid', async (pids) => { diff --git a/src/upgrades/1.19.3/fix_user_uploads_zset.ts b/src/upgrades/1.19.3/fix_user_uploads_zset.ts index b86a83e561..05c38cb820 100644 --- a/src/upgrades/1.19.3/fix_user_uploads_zset.ts +++ b/src/upgrades/1.19.3/fix_user_uploads_zset.ts @@ -1,13 +1,19 @@ 'use strict'; -const crypto = require('crypto'); +import crypto from 'crypto'; + + + +import db from '../../database'; + + +import * as batch from '../../batch'; + -const db = require('../../database'); -const batch = require('../../batch'); const md5 = filename => crypto.createHash('md5').update(filename).digest('hex'); -module.exports = { +export const obj = { name: 'Fix paths in user uploads sorted sets', timestamp: Date.UTC(2022, 1, 10), method: async function () { diff --git a/src/upgrades/1.19.3/rename_post_upload_hashes.ts b/src/upgrades/1.19.3/rename_post_upload_hashes.ts index 5664243c3f..9ed10f41e7 100644 --- a/src/upgrades/1.19.3/rename_post_upload_hashes.ts +++ b/src/upgrades/1.19.3/rename_post_upload_hashes.ts @@ -2,14 +2,15 @@ 'use strict'; -const crypto = require('crypto'); +import crypto from 'crypto'; +import db from '../../database'; +import * as batch from '../../batch'; + -const db = require('../../database'); -const batch = require('../../batch'); const md5 = filename => crypto.createHash('md5').update(filename).digest('hex'); -module.exports = { +export const obj = { name: 'Rename object and sorted sets used in post uploads', timestamp: Date.UTC(2022, 1, 10), method: async function () { diff --git a/src/upgrades/1.2.0/category_recent_tids.ts b/src/upgrades/1.2.0/category_recent_tids.ts index 4a216593c8..5c9a4f99db 100644 --- a/src/upgrades/1.2.0/category_recent_tids.ts +++ b/src/upgrades/1.2.0/category_recent_tids.ts @@ -1,10 +1,12 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); +import async from 'async'; +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Category recent tids', timestamp: Date.UTC(2016, 8, 22), method: function (callback) { diff --git a/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.ts b/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.ts index a6aa26ba4d..692cf78ad4 100644 --- a/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.ts +++ b/src/upgrades/1.2.0/edit_delete_deletetopic_privileges.ts @@ -2,15 +2,15 @@ 'use strict'; -const winston = require('winston'); -const db = require('../../database'); +import winston from 'winston'; +import db from '../../database'; +import groupsAPI from '../../groups'; +import privilegesAPI from '../../privileges'; -module.exports = { +export const obj = { name: 'Granting edit/delete/delete topic on existing categories', timestamp: Date.UTC(2016, 7, 7), method: async function () { - const groupsAPI = require('../../groups'); - const privilegesAPI = require('../../privileges'); const cids = await db.getSortedSetRange('categories:cid', 0, -1); diff --git a/src/upgrades/1.3.0/favourites_to_bookmarks.ts b/src/upgrades/1.3.0/favourites_to_bookmarks.ts index a08aa6a5d3..7269f70e46 100644 --- a/src/upgrades/1.3.0/favourites_to_bookmarks.ts +++ b/src/upgrades/1.3.0/favourites_to_bookmarks.ts @@ -1,13 +1,13 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Favourites to Bookmarks', timestamp: Date.UTC(2016, 9, 8), method: async function () { const { progress } = this; - const batch = require('../../batch'); async function upgradePosts() { await batch.processSortedSet('posts:pid', async (ids) => { diff --git a/src/upgrades/1.3.0/sorted_sets_for_post_replies.ts b/src/upgrades/1.3.0/sorted_sets_for_post_replies.ts index 630757b9d9..dedc018458 100644 --- a/src/upgrades/1.3.0/sorted_sets_for_post_replies.ts +++ b/src/upgrades/1.3.0/sorted_sets_for_post_replies.ts @@ -1,16 +1,16 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import posts from '../../posts'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Sorted sets for post replies', timestamp: Date.UTC(2016, 9, 14), method: function (callback) { - const posts = require('../../posts'); - const batch = require('../../batch'); const { progress } = this; batch.processSortedSet('posts:pid', (ids, next) => { diff --git a/src/upgrades/1.4.0/global_and_user_language_keys.ts b/src/upgrades/1.4.0/global_and_user_language_keys.ts index e18442e8f8..34c0f2246d 100644 --- a/src/upgrades/1.4.0/global_and_user_language_keys.ts +++ b/src/upgrades/1.4.0/global_and_user_language_keys.ts @@ -1,16 +1,16 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import user from '../../user'; +import meta from '../../meta'; +import * as batch from '../../batch'; -module.exports = { + +export const obj = { name: 'Update global and user language keys', timestamp: Date.UTC(2016, 10, 22), method: async function () { const { progress } = this; - const user = require('../../user'); - const meta = require('../../meta'); - const batch = require('../../batch'); - const defaultLang = await meta.configs.get('defaultLang'); if (defaultLang) { const newLanguage = defaultLang.replace('_', '-').replace('@', '-x-'); diff --git a/src/upgrades/1.4.0/sorted_set_for_pinned_topics.ts b/src/upgrades/1.4.0/sorted_set_for_pinned_topics.ts index 042dc6c948..fd1f798603 100644 --- a/src/upgrades/1.4.0/sorted_set_for_pinned_topics.ts +++ b/src/upgrades/1.4.0/sorted_set_for_pinned_topics.ts @@ -1,16 +1,16 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); -const db = require('../../database'); +import async from 'async'; +import winston from 'winston'; +import db from '../../database'; +import topics from '../../topics'; +import * as batch from '../../batch'; -module.exports = { +export const obj = { name: 'Sorted set for pinned topics', timestamp: Date.UTC(2016, 10, 25), method: function (callback) { - const topics = require('../../topics'); - const batch = require('../../batch'); batch.processSortedSet('topics:tid', (ids, next) => { topics.getTopicsFields(ids, ['tid', 'cid', 'pinned', 'lastposttime'], (err, data) => { if (err) { diff --git a/src/upgrades/1.4.4/config_urls_update.ts b/src/upgrades/1.4.4/config_urls_update.ts index 97b3c95670..d5671be5b8 100644 --- a/src/upgrades/1.4.4/config_urls_update.ts +++ b/src/upgrades/1.4.4/config_urls_update.ts @@ -1,9 +1,11 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Upgrading config urls to use assets route', timestamp: Date.UTC(2017, 1, 28), method: async function () { diff --git a/src/upgrades/1.4.4/sound_settings.ts b/src/upgrades/1.4.4/sound_settings.ts index ae0a6d8fa3..ed7508c175 100644 --- a/src/upgrades/1.4.4/sound_settings.ts +++ b/src/upgrades/1.4.4/sound_settings.ts @@ -1,15 +1,14 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); +import async from 'async'; +import db from '../../database'; +import meta from '../../meta'; +import * as batch from '../../batch'; - -module.exports = { +export const obj = { name: 'Update global and user sound settings', timestamp: Date.UTC(2017, 1, 25), method: function (callback) { - const meta = require('../../meta'); - const batch = require('../../batch'); const map = { 'notification.mp3': 'Default | Deedle-dum', diff --git a/src/upgrades/1.4.6/delete_sessions.ts b/src/upgrades/1.4.6/delete_sessions.ts index dc3a1f465c..0c0e118ccc 100644 --- a/src/upgrades/1.4.6/delete_sessions.ts +++ b/src/upgrades/1.4.6/delete_sessions.ts @@ -1,25 +1,28 @@ 'use strict'; -const nconf = require('nconf'); -const db = require('../../database'); -const batch = require('../../batch'); +import nconf from 'nconf'; +import db from '../../database'; +//@ts-ignore +import cJSON from '../../../config.json'; +import * as batch from '../../batch'; +import connection from '../../database/redis/connection'; -module.exports = { + +export const obj = { name: 'Delete accidentally long-lived sessions', timestamp: Date.UTC(2017, 3, 16), method: async function () { let configJSON; try { - configJSON = require('../../../config.json') || { [process.env.database]: true }; - } catch (err) { - configJSON = { [process.env.database]: true }; + configJSON = cJSON || { [(process as any).env.database]: true }; + } catch (err: any) { + configJSON = { [(process as any).env.database]: true }; } const isRedisSessionStore = configJSON.hasOwnProperty('redis'); const { progress } = this; if (isRedisSessionStore) { - const connection = require('../../database/redis/connection'); const client = await connection.connect(nconf.get('redis')); const sessionKeys = await client.keys('sess:*'); progress.total = sessionKeys.length; diff --git a/src/upgrades/1.5.0/allowed_file_extensions.ts b/src/upgrades/1.5.0/allowed_file_extensions.ts index 5f7ee7c268..d3f2c2ea0f 100644 --- a/src/upgrades/1.5.0/allowed_file_extensions.ts +++ b/src/upgrades/1.5.0/allowed_file_extensions.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Set default allowed file extensions', timestamp: Date.UTC(2017, 3, 14), method: function (callback) { diff --git a/src/upgrades/1.5.0/flags_refactor.ts b/src/upgrades/1.5.0/flags_refactor.ts index dfbb28d70d..114e40aeed 100644 --- a/src/upgrades/1.5.0/flags_refactor.ts +++ b/src/upgrades/1.5.0/flags_refactor.ts @@ -1,14 +1,14 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +import * as batch from '../../batch'; +import posts from '../../posts'; +import flags from '../../flags'; -module.exports = { +export const obj = { name: 'Migrating flags to new schema', timestamp: Date.UTC(2016, 11, 7), method: async function () { - const batch = require('../../batch'); - const posts = require('../../posts'); - const flags = require('../../flags'); const { progress } = this; await batch.processSortedSet('posts:pid', async (ids) => { @@ -42,7 +42,7 @@ module.exports = { history = history.filter(event => event.type === 'notes')[0]; await flags.appendNote(flagObj.flagId, history.uid, post['flag:notes'], history.timestamp); } - } catch (err) { + } catch (err: any) { if (err.message !== '[[error:post-already-flagged]]') { throw err; } diff --git a/src/upgrades/1.5.0/moderation_history_refactor.ts b/src/upgrades/1.5.0/moderation_history_refactor.ts index 8a98830acf..a4eac623c1 100644 --- a/src/upgrades/1.5.0/moderation_history_refactor.ts +++ b/src/upgrades/1.5.0/moderation_history_refactor.ts @@ -1,11 +1,13 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); -const batch = require('../../batch'); +import async from 'async'; +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { + + +export const obj = { name: 'Update moderation notes to zset', timestamp: Date.UTC(2017, 2, 22), method: function (callback) { diff --git a/src/upgrades/1.5.0/post_votes_zset.ts b/src/upgrades/1.5.0/post_votes_zset.ts index 810a1886b1..c99f991ffd 100644 --- a/src/upgrades/1.5.0/post_votes_zset.ts +++ b/src/upgrades/1.5.0/post_votes_zset.ts @@ -1,16 +1,16 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); +import async from 'async'; +import db from '../../database'; +import * as batch from '../../batch'; - -module.exports = { +export const obj = { name: 'New sorted set posts:votes', timestamp: Date.UTC(2017, 1, 27), method: function (callback) { const { progress } = this; - require('../../batch').processSortedSet('posts:pid', (pids, next) => { + batch.processSortedSet('posts:pid', (pids, next) => { async.each(pids, (pid, next) => { db.getObjectFields(`post:${pid}`, ['upvotes', 'downvotes'], (err, postData) => { if (err || !postData) { diff --git a/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.ts b/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.ts index 769ca20247..fe6fd3445b 100644 --- a/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.ts +++ b/src/upgrades/1.5.0/remove_relative_uploaded_profile_cover.ts @@ -1,9 +1,11 @@ 'use strict'; -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; +import * as batch from '../../batch'; -module.exports = { + + +export const obj = { name: 'Remove relative_path from uploaded profile cover urls', timestamp: Date.UTC(2017, 3, 26), method: async function () { diff --git a/src/upgrades/1.5.1/rename_mods_group.ts b/src/upgrades/1.5.1/rename_mods_group.ts index 5e64dc0a53..856a0ae5d1 100644 --- a/src/upgrades/1.5.1/rename_mods_group.ts +++ b/src/upgrades/1.5.1/rename_mods_group.ts @@ -1,13 +1,14 @@ 'use strict'; -const async = require('async'); -const winston = require('winston'); - -const batch = require('../../batch'); -const groups = require('../../groups'); +import async from 'async'; +import winston from 'winston'; +import * as batch from '../../batch'; +import groups from '../../groups'; -module.exports = { + + +export const obj = { name: 'rename user mod privileges group', timestamp: Date.UTC(2017, 4, 26), method: function (callback) { diff --git a/src/upgrades/1.5.2/rss_token_wipe.ts b/src/upgrades/1.5.2/rss_token_wipe.ts index a2097dcc25..34193a8847 100644 --- a/src/upgrades/1.5.2/rss_token_wipe.ts +++ b/src/upgrades/1.5.2/rss_token_wipe.ts @@ -1,10 +1,14 @@ 'use strict'; -const async = require('async'); -const batch = require('../../batch'); -const db = require('../../database'); +import async from 'async'; +import * as batch from '../../batch'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Wipe all existing RSS tokens', timestamp: Date.UTC(2017, 6, 5), method: function (callback) { diff --git a/src/upgrades/1.5.2/tags_privilege.ts b/src/upgrades/1.5.2/tags_privilege.ts index 72b9b730b8..d4c095caf3 100644 --- a/src/upgrades/1.5.2/tags_privilege.ts +++ b/src/upgrades/1.5.2/tags_privilege.ts @@ -1,15 +1,15 @@ 'use strict'; -const async = require('async'); +import async from 'async'; -const batch = require('../../batch'); +import * as batch from '../../batch'; +import privileges from '../../privileges'; -module.exports = { +export const obj = { name: 'Give tag privilege to registered-users on all categories', timestamp: Date.UTC(2017, 5, 16), method: function (callback) { const { progress } = this; - const privileges = require('../../privileges'); batch.processSortedSet('categories:cid', (cids, next) => { async.eachSeries(cids, (cid, next) => { progress.incr(); diff --git a/src/upgrades/1.6.0/clear-stale-digest-template.ts b/src/upgrades/1.6.0/clear-stale-digest-template.ts index 0eabe804f6..fca9e6a491 100644 --- a/src/upgrades/1.6.0/clear-stale-digest-template.ts +++ b/src/upgrades/1.6.0/clear-stale-digest-template.ts @@ -1,9 +1,8 @@ 'use strict'; -const crypto = require('crypto'); -const meta = require('../../meta'); - -module.exports = { +import crypto from 'crypto'; +import meta from '../../meta'; +export const obj = { name: 'Clearing stale digest templates that were accidentally saved as custom', timestamp: Date.UTC(2017, 8, 6), method: async function () { diff --git a/src/upgrades/1.6.0/generate-email-logo.ts b/src/upgrades/1.6.0/generate-email-logo.ts index 069f1aa723..34b6ba4f31 100644 --- a/src/upgrades/1.6.0/generate-email-logo.ts +++ b/src/upgrades/1.6.0/generate-email-logo.ts @@ -1,14 +1,14 @@ 'use strict'; -const async = require('async'); -const path = require('path'); -const nconf = require('nconf'); -const fs = require('fs'); -const meta = require('../../meta'); -const image = require('../../image'); +import async from 'async'; +import path from 'path'; +import nconf from 'nconf'; +import fs from 'fs'; +import meta from '../../meta'; +import image from '../../image'; -module.exports = { +export const obj = { name: 'Generate email logo for use in email header', timestamp: Date.UTC(2017, 6, 17), method: function (callback) { diff --git a/src/upgrades/1.6.0/ipblacklist-fix.ts b/src/upgrades/1.6.0/ipblacklist-fix.ts index 000de231ba..eee39d2502 100644 --- a/src/upgrades/1.6.0/ipblacklist-fix.ts +++ b/src/upgrades/1.6.0/ipblacklist-fix.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Changing ip blacklist storage to object', timestamp: Date.UTC(2017, 8, 7), method: async function () { diff --git a/src/upgrades/1.6.0/robots-config-change.ts b/src/upgrades/1.6.0/robots-config-change.ts index 7e787389e7..649c54b084 100644 --- a/src/upgrades/1.6.0/robots-config-change.ts +++ b/src/upgrades/1.6.0/robots-config-change.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Fix incorrect robots.txt schema', timestamp: Date.UTC(2017, 6, 10), method: async function () { diff --git a/src/upgrades/1.6.2/topics_lastposttime_zset.ts b/src/upgrades/1.6.2/topics_lastposttime_zset.ts index 1dee9feb1a..2314e0d166 100644 --- a/src/upgrades/1.6.2/topics_lastposttime_zset.ts +++ b/src/upgrades/1.6.2/topics_lastposttime_zset.ts @@ -1,10 +1,12 @@ 'use strict'; -const async = require('async'); +import async from 'async'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'New sorted set cid::tids:lastposttime', timestamp: Date.UTC(2017, 9, 30), method: function (callback) { diff --git a/src/upgrades/1.7.0/generate-custom-html.ts b/src/upgrades/1.7.0/generate-custom-html.ts index 769633e80b..1e270c5af6 100644 --- a/src/upgrades/1.7.0/generate-custom-html.ts +++ b/src/upgrades/1.7.0/generate-custom-html.ts @@ -1,9 +1,10 @@ 'use strict'; -const db = require('../../database'); -const meta = require('../../meta'); +import db from '../../database'; -module.exports = { + +import meta from '../../meta'; +export const obj = { name: 'Generate customHTML block from old customJS setting', timestamp: Date.UTC(2017, 9, 12), method: function (callback) { @@ -12,7 +13,7 @@ module.exports = { return callback(err); } - let newJS = []; + let newJS = [] as any; // Forgive me for parsing HTML with regex... const scriptMatch = /^([\s\S]+?)<\/script>/m; diff --git a/src/upgrades/1.7.1/notification-settings.ts b/src/upgrades/1.7.1/notification-settings.ts index fed592effb..dd1d047e32 100644 --- a/src/upgrades/1.7.1/notification-settings.ts +++ b/src/upgrades/1.7.1/notification-settings.ts @@ -1,9 +1,13 @@ 'use strict'; -const batch = require('../../batch'); -const db = require('../../database'); +import * as batch from '../../batch'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Convert old notification digest settings', timestamp: Date.UTC(2017, 10, 15), method: async function () { diff --git a/src/upgrades/1.7.3/key_value_schema_change.ts b/src/upgrades/1.7.3/key_value_schema_change.ts index 0fb38f4c44..6519eba43d 100644 --- a/src/upgrades/1.7.3/key_value_schema_change.ts +++ b/src/upgrades/1.7.3/key_value_schema_change.ts @@ -2,17 +2,20 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; +// @ts-ignore +import configJSONModule from '../../../config.json'; -module.exports = { + +export const obj = { name: 'Change the schema of simple keys so they don\'t use value field (mongodb only)', timestamp: Date.UTC(2017, 11, 18), method: async function () { let configJSON; try { - configJSON = require('../../../config.json') || { [process.env.database]: true, database: process.env.database }; - } catch (err) { - configJSON = { [process.env.database]: true, database: process.env.database }; + configJSON = configJSONModule || { [(process as any).env.database]: true, database: (process as any).env.database }; + } catch (err: any) { + configJSON = { [(process as any).env.database]: true, database: (process as any).env.database }; } const isMongo = configJSON.hasOwnProperty('mongo') && configJSON.database === 'mongo'; const { progress } = this; diff --git a/src/upgrades/1.7.3/topic_votes.ts b/src/upgrades/1.7.3/topic_votes.ts index 008aaece0a..339a943da5 100644 --- a/src/upgrades/1.7.3/topic_votes.ts +++ b/src/upgrades/1.7.3/topic_votes.ts @@ -1,10 +1,14 @@ 'use strict'; -const batch = require('../../batch'); -const db = require('../../database'); +import * as batch from '../../batch'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Add votes to topics', timestamp: Date.UTC(2017, 11, 8), method: async function () { diff --git a/src/upgrades/1.7.4/chat_privilege.ts b/src/upgrades/1.7.4/chat_privilege.ts index 360a7b8c57..278d9efe75 100644 --- a/src/upgrades/1.7.4/chat_privilege.ts +++ b/src/upgrades/1.7.4/chat_privilege.ts @@ -1,9 +1,11 @@ 'use strict'; -const groups = require('../../groups'); +import groups from '../../groups'; -module.exports = { + + +export const obj = { name: 'Give chat privilege to registered-users', timestamp: Date.UTC(2017, 11, 18), method: function (callback) { diff --git a/src/upgrades/1.7.4/fix_moved_topics_byvotes.ts b/src/upgrades/1.7.4/fix_moved_topics_byvotes.ts index 33aafcb70d..c14a79fd73 100644 --- a/src/upgrades/1.7.4/fix_moved_topics_byvotes.ts +++ b/src/upgrades/1.7.4/fix_moved_topics_byvotes.ts @@ -1,9 +1,13 @@ 'use strict'; -const batch = require('../../batch'); -const db = require('../../database'); +import * as batch from '../../batch'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Fix sort by votes for moved topics', timestamp: Date.UTC(2018, 0, 8), method: async function () { diff --git a/src/upgrades/1.7.4/fix_user_topics_per_category.ts b/src/upgrades/1.7.4/fix_user_topics_per_category.ts index 5ee19fb41f..c92535b64c 100644 --- a/src/upgrades/1.7.4/fix_user_topics_per_category.ts +++ b/src/upgrades/1.7.4/fix_user_topics_per_category.ts @@ -1,9 +1,13 @@ 'use strict'; -const batch = require('../../batch'); -const db = require('../../database'); +import * as batch from '../../batch'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Fix topics in categories per user if they were moved', timestamp: Date.UTC(2018, 0, 22), method: async function () { diff --git a/src/upgrades/1.7.4/global_upload_privilege.ts b/src/upgrades/1.7.4/global_upload_privilege.ts index b2db7813c6..7336e8feec 100644 --- a/src/upgrades/1.7.4/global_upload_privilege.ts +++ b/src/upgrades/1.7.4/global_upload_privilege.ts @@ -1,12 +1,18 @@ 'use strict'; -const async = require('async'); -const groups = require('../../groups'); -const privileges = require('../../privileges'); -const db = require('../../database'); +import async from 'async'; +import groups from '../../groups'; -module.exports = { + +import privileges from '../../privileges'; + + +import db from '../../database'; + + + +export const obj = { name: 'Give upload privilege to registered-users globally if it is given on a category', timestamp: Date.UTC(2018, 0, 3), method: function (callback) { diff --git a/src/upgrades/1.7.4/rename_min_reputation_settings.ts b/src/upgrades/1.7.4/rename_min_reputation_settings.ts index 6edb9d7e46..685844370e 100644 --- a/src/upgrades/1.7.4/rename_min_reputation_settings.ts +++ b/src/upgrades/1.7.4/rename_min_reputation_settings.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Rename privileges:downvote and privileges:flag to min:rep:downvote, min:rep:flag respectively', timestamp: Date.UTC(2018, 0, 12), method: function (callback) { diff --git a/src/upgrades/1.7.4/vote_privilege.ts b/src/upgrades/1.7.4/vote_privilege.ts index 12eda4b8e6..0423e2b6c5 100644 --- a/src/upgrades/1.7.4/vote_privilege.ts +++ b/src/upgrades/1.7.4/vote_privilege.ts @@ -1,12 +1,16 @@ 'use strict'; -const async = require('async'); +import async from 'async'; -const privileges = require('../../privileges'); -const db = require('../../database'); +import privileges from '../../privileges'; -module.exports = { + +import db from '../../database'; + + + +export const obj = { name: 'Give vote privilege to registered-users on all categories', timestamp: Date.UTC(2018, 0, 9), method: function (callback) { diff --git a/src/upgrades/1.7.6/flatten_navigation_data.ts b/src/upgrades/1.7.6/flatten_navigation_data.ts index 96dc6408ae..a9a9cf819d 100644 --- a/src/upgrades/1.7.6/flatten_navigation_data.ts +++ b/src/upgrades/1.7.6/flatten_navigation_data.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Flatten navigation data', timestamp: Date.UTC(2018, 1, 17), method: async function () { diff --git a/src/upgrades/1.7.6/notification_types.ts b/src/upgrades/1.7.6/notification_types.ts index 42d59cdd38..ad7b30e127 100644 --- a/src/upgrades/1.7.6/notification_types.ts +++ b/src/upgrades/1.7.6/notification_types.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Add default settings for notification delivery types', timestamp: Date.UTC(2018, 1, 14), method: async function () { diff --git a/src/upgrades/1.7.6/update_min_pass_strength.ts b/src/upgrades/1.7.6/update_min_pass_strength.ts index b207e0c166..82ca0c902a 100644 --- a/src/upgrades/1.7.6/update_min_pass_strength.ts +++ b/src/upgrades/1.7.6/update_min_pass_strength.ts @@ -1,8 +1,10 @@ 'use strict'; -const db = require('../../database'); +import db from '../../database'; -module.exports = { + + +export const obj = { name: 'Revising minimum password strength to 1 (from 0)', timestamp: Date.UTC(2018, 1, 21), method: async function () { diff --git a/src/upgrades/1.8.0/give_signature_privileges.ts b/src/upgrades/1.8.0/give_signature_privileges.ts index adcc80e96f..85dd3de014 100644 --- a/src/upgrades/1.8.0/give_signature_privileges.ts +++ b/src/upgrades/1.8.0/give_signature_privileges.ts @@ -1,8 +1,10 @@ 'use strict'; -const privileges = require('../../privileges'); +import privileges from '../../privileges'; -module.exports = { + + +export const obj = { name: 'Give registered users signature privilege', timestamp: Date.UTC(2018, 1, 28), method: function (callback) { diff --git a/src/upgrades/1.8.0/give_spiders_privileges.ts b/src/upgrades/1.8.0/give_spiders_privileges.ts index 1dc9055753..48c0da781d 100644 --- a/src/upgrades/1.8.0/give_spiders_privileges.ts +++ b/src/upgrades/1.8.0/give_spiders_privileges.ts @@ -1,12 +1,12 @@ 'use strict'; -const async = require('async'); -const groups = require('../../groups'); -const privileges = require('../../privileges'); -const db = require('../../database'); +import async from 'async'; +import groups from '../../groups'; +import privileges from '../../privileges'; +import db from '../../database'; -module.exports = { +export const obj = { name: 'Give category access privileges to spiders system group', timestamp: Date.UTC(2018, 0, 31), method: function (callback) { diff --git a/src/upgrades/1.8.1/diffs_zset_to_listhash.ts b/src/upgrades/1.8.1/diffs_zset_to_listhash.ts index 370242fba1..a236bddecd 100644 --- a/src/upgrades/1.8.1/diffs_zset_to_listhash.ts +++ b/src/upgrades/1.8.1/diffs_zset_to_listhash.ts @@ -1,11 +1,15 @@ 'use strict'; -const async = require('async'); -const db = require('../../database'); -const batch = require('../../batch'); +import async from 'async'; +import db from '../../database'; -module.exports = { +import * as batch from '../../batch'; + + + + +export const obj = { name: 'Reformatting post diffs to be stored in lists and hash instead of single zset', timestamp: Date.UTC(2018, 2, 15), method: function (callback) { diff --git a/src/upgrades/1.9.0/refresh_post_upload_associations.ts b/src/upgrades/1.9.0/refresh_post_upload_associations.ts index 44acfc079f..b31e1712f6 100644 --- a/src/upgrades/1.9.0/refresh_post_upload_associations.ts +++ b/src/upgrades/1.9.0/refresh_post_upload_associations.ts @@ -1,9 +1,9 @@ 'use strict'; -const async = require('async'); -const posts = require('../../posts'); +import async from 'async'; +import posts from '../../posts'; -module.exports = { +export const obj = { name: 'Refresh post-upload associations', timestamp: Date.UTC(2018, 3, 16), method: function (callback) { diff --git a/src/upgrades/TEMPLATE b/src/upgrades/TEMPLATE index e6396ecb35..06efcd24fa 100644 --- a/src/upgrades/TEMPLATE +++ b/src/upgrades/TEMPLATE @@ -1,7 +1,5 @@ 'use strict'; -const db = require('../../database'); - module.exports = { // you should use spaces // the underscores are there so you can double click to select the whole thing diff --git a/src/user/admin.ts b/src/user/admin.ts index c92035fc47..405bec00e9 100644 --- a/src/user/admin.ts +++ b/src/user/admin.ts @@ -1,17 +1,17 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); -const winston = require('winston'); -const validator = require('validator'); +import fs from 'fs'; +import path from 'path'; +import winston from 'winston'; +import validator from 'validator'; +import { paths } from '../constants'; +import db from '../database'; +import plugins from '../plugins'; +import * as batch from '../batch'; +const { baseDir } = paths; -const { baseDir } = require('../constants').paths; -const db = require('../database'); -const plugins = require('../plugins'); -const batch = require('../batch'); - -module.exports = function (User) { +export default function (User) { User.logIP = async function (uid, ip) { if (!(parseInt(uid, 10) > 0)) { return; diff --git a/src/user/approval.ts b/src/user/approval.ts index 9f2aeca562..3fdb8a46bf 100644 --- a/src/user/approval.ts +++ b/src/user/approval.ts @@ -1,19 +1,19 @@ 'use strict'; -const validator = require('validator'); -const winston = require('winston'); -const cronJob = require('cron').CronJob; +import validator from 'validator'; +import winston from 'winston'; +import { CronJob } from 'cron'; +const cronJob = CronJob; +import db from '../database'; +import meta from '../meta'; +import emailer from '../emailer'; +import notifications from '../notifications'; +import groups from '../groups'; +import utils from '../utils'; +import slugify from '../slugify'; +import plugins from '../plugins'; -const db = require('../database'); -const meta = require('../meta'); -const emailer = require('../emailer'); -const notifications = require('../notifications'); -const groups = require('../groups'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const plugins = require('../plugins'); - -module.exports = function (User) { +export default function (User) { new cronJob('0 * * * *', (() => { User.autoApprove(); }), null, true); diff --git a/src/user/auth.ts b/src/user/auth.ts index d8113547e6..0752192327 100644 --- a/src/user/auth.ts +++ b/src/user/auth.ts @@ -1,16 +1,17 @@ 'use strict'; -const winston = require('winston'); -const validator = require('validator'); -const util = require('util'); -const _ = require('lodash'); -const db = require('../database'); -const meta = require('../meta'); -const events = require('../events'); -const batch = require('../batch'); -const utils = require('../utils'); +import winston from 'winston'; +import validator from 'validator'; +import util from 'util'; +import _ from 'lodash'; +import db from '../database'; +import meta from '../meta'; -module.exports = function (User) { +import events from '../events'; +import * as batch from '../batch'; +import utils from '../utils'; + +export default function (User) { User.auth = {}; User.auth.logAttempt = async function (uid, ip) { @@ -93,7 +94,7 @@ module.exports = function (User) { const expiredSids = []; await Promise.all(Object.keys(uuidMapping).map(async (uuid) => { const sid = uuidMapping[uuid]; - const sessionObj = await getSessionFromStore(sid); + const sessionObj: any = await getSessionFromStore(sid); const expired = !sessionObj || !sessionObj.hasOwnProperty('passport') || !sessionObj.passport.hasOwnProperty('user') || parseInt(sessionObj.passport.user, 10) !== parseInt(uid, 10); @@ -125,7 +126,7 @@ module.exports = function (User) { User.auth.revokeSession = async function (sessionId, uid) { winston.verbose(`[user.auth] Revoking session ${sessionId} for user ${uid}`); - const sessionObj = await getSessionFromStore(sessionId); + const sessionObj: any = await getSessionFromStore(sessionId); if (sessionObj && sessionObj.meta && sessionObj.meta.uuid) { await db.deleteObjectField(`uid:${uid}:sessionUUID:sessionId`, sessionObj.meta.uuid); } diff --git a/src/user/bans.ts b/src/user/bans.ts index 8a7352d29e..d737542cea 100644 --- a/src/user/bans.ts +++ b/src/user/bans.ts @@ -1,14 +1,15 @@ 'use strict'; -const winston = require('winston'); +import winston from 'winston'; -const meta = require('../meta'); -const emailer = require('../emailer'); -const db = require('../database'); -const groups = require('../groups'); -const privileges = require('../privileges'); +import meta from '../meta'; -module.exports = function (User) { +import emailer from '../emailer'; +import db from '../database'; +import groups from '../groups'; +import privileges from '../privileges'; + +export default function (User) { User.bans = {}; User.bans.ban = async function (uid, until, reason) { @@ -29,7 +30,7 @@ module.exports = function (User) { uid: uid, timestamp: now, expire: until > now ? until : 0, - }; + } as any; if (reason) { banData.reason = reason; } diff --git a/src/user/blocks.ts b/src/user/blocks.ts index 19ad2c0766..7d94d25828 100644 --- a/src/user/blocks.ts +++ b/src/user/blocks.ts @@ -1,10 +1,10 @@ 'use strict'; -const db = require('../database'); -const plugins = require('../plugins'); -const cacheCreate = require('../cache/lru'); +import db from '../database'; +import plugins from '../plugins'; +import cacheCreate from '../cache/lru'; -module.exports = function (User) { +export default function (User) { User.blocks = { _cache: cacheCreate({ name: 'user:blocks', diff --git a/src/user/categories.ts b/src/user/categories.ts index a1d141a628..1f838887f0 100644 --- a/src/user/categories.ts +++ b/src/user/categories.ts @@ -1,12 +1,12 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; -const db = require('../database'); -const categories = require('../categories'); -const plugins = require('../plugins'); +import db from '../database'; +import categories from '../categories'; +import plugins from '../plugins'; -module.exports = function (User) { +export default function (User) { User.setCategoryWatchState = async function (uid, cids, state) { if (!(parseInt(uid, 10) > 0)) { return; diff --git a/src/user/create.ts b/src/user/create.ts index 6d598d03ff..415bd845b7 100644 --- a/src/user/create.ts +++ b/src/user/create.ts @@ -1,17 +1,18 @@ 'use strict'; -const zxcvbn = require('zxcvbn'); -const winston = require('winston'); +import zxcvbn from 'zxcvbn'; +import winston from 'winston'; -const db = require('../database'); -const utils = require('../utils'); -const slugify = require('../slugify'); -const plugins = require('../plugins'); -const groups = require('../groups'); -const meta = require('../meta'); -const analytics = require('../analytics'); +import db from '../database'; +import utils from '../utils'; +import slugify from '../slugify'; +import plugins from '../plugins'; +import groups from '../groups'; +import meta from '../meta'; -module.exports = function (User) { +import analytics from '../analytics'; + +export default function (User) { User.create = async function (data) { data.username = data.username.trim(); data.userslug = slugify(data.username); @@ -49,7 +50,7 @@ module.exports = function (User) { joindate: timestamp, lastonline: timestamp, status: 'online', - }; + } as any; ['picture', 'fullname', 'location', 'birthday'].forEach((field) => { if (data[field]) { userData[field] = data[field]; diff --git a/src/user/data.ts b/src/user/data.ts index 6c46268e81..5b90ec55d0 100644 --- a/src/user/data.ts +++ b/src/user/data.ts @@ -1,13 +1,14 @@ 'use strict'; -const validator = require('validator'); -const nconf = require('nconf'); -const _ = require('lodash'); +import validator from 'validator'; +import nconf from 'nconf'; +import _ from 'lodash'; -const db = require('../database'); -const meta = require('../meta'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import db from '../database'; +import meta from '../meta'; + +import plugins from '../plugins'; +import utils from '../utils'; const relative_path = nconf.get('relative_path'); @@ -18,7 +19,7 @@ const intFields = [ 'blocksCount', 'passwordExpiry', 'mutedUntil', ]; -module.exports = function (User) { +export default function (User) { const fieldWhitelist = [ 'uid', 'username', 'userslug', 'email', 'email:confirmed', 'joindate', 'lastonline', 'picture', 'icon:bgColor', 'fullname', 'location', 'birthday', 'website', @@ -115,7 +116,7 @@ module.exports = function (User) { function uidsToUsers(uids, uniqueUids, usersData) { const uidToUser = _.zipObject(uniqueUids, usersData); const users = uids.map((uid) => { - const user = uidToUser[uid] || { ...User.guestData }; + const user: any = uidToUser[uid] || { ...User.guestData }; if (!parseInt(user.uid, 10)) { user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]'; user.displayname = user.username; @@ -291,7 +292,7 @@ module.exports = function (User) { function parseGroupTitle(user) { try { user.groupTitleArray = JSON.parse(user.groupTitle); - } catch (err) { + } catch (err: any) { if (user.groupTitle) { user.groupTitleArray = [user.groupTitle]; } else { diff --git a/src/user/delete.ts b/src/user/delete.ts index 4a7e72dac9..4717e6d337 100644 --- a/src/user/delete.ts +++ b/src/user/delete.ts @@ -1,22 +1,22 @@ 'use strict'; -const async = require('async'); -const _ = require('lodash'); -const path = require('path'); -const nconf = require('nconf'); -const util = require('util'); +import async from 'async'; +import _ from 'lodash'; +import path from 'path'; +import nconf from 'nconf'; +import util from 'util'; const rimrafAsync = util.promisify(require('rimraf')); -const db = require('../database'); -const posts = require('../posts'); -const flags = require('../flags'); -const topics = require('../topics'); -const groups = require('../groups'); -const messaging = require('../messaging'); -const plugins = require('../plugins'); -const batch = require('../batch'); +import db from '../database'; +import posts from '../posts'; +import flags from '../flags'; +import topics from '../topics'; +import groups from '../groups'; +import messaging from '../messaging'; +import plugins from '../plugins'; +import * as batch from '../batch'; -module.exports = function (User) { +export default function (User) { const deletesInProgress = {}; User.delete = async (callerUid, uid) => { diff --git a/src/user/digest.ts b/src/user/digest.ts index a40be0ee0d..3c914e4f19 100644 --- a/src/user/digest.ts +++ b/src/user/digest.ts @@ -1,18 +1,19 @@ 'use strict'; -const winston = require('winston'); -const nconf = require('nconf'); +import winston from 'winston'; +import nconf from 'nconf'; -const db = require('../database'); -const batch = require('../batch'); -const meta = require('../meta'); -const user = require('./index'); -const topics = require('../topics'); -const plugins = require('../plugins'); -const emailer = require('../emailer'); -const utils = require('../utils'); +import db from '../database'; +import * as batch from '../batch'; +import meta from '../meta'; -const Digest = module.exports; +import user from './index'; +import topics from '../topics'; +import plugins from '../plugins'; +import emailer from '../emailer'; +import utils from '../utils'; + +const Digest = {} as any; const baseUrl = nconf.get('base_url'); @@ -36,7 +37,7 @@ Digest.execute = async function (payload) { subscribers: subscribers, }); winston.info(`[user/jobs] Digest (${payload.interval}) complete.`); - } catch (err) { + } catch (err: any) { winston.error(`[user/jobs] Could not send digests (${payload.interval})\n${err.stack}`); throw err; } @@ -157,7 +158,7 @@ Digest.getDeliveryTimes = async (start, stop) => { ]); // Populate user data - let userData = await user.getUsersFields(uids, ['username', 'picture']); + let userData: any = await user.getUsersFields(uids, ['username', 'picture']); userData = userData.map((user, idx) => { user.lastDelivery = scores[idx] ? new Date(scores[idx]).toISOString() : '[[admin/manage/digest:null]]'; user.setting = settings[idx]; @@ -210,3 +211,5 @@ async function getTermTopics(term, uid) { }); return { top, popular, recent }; } + +export default Digest; \ No newline at end of file diff --git a/src/user/email.ts b/src/user/email.ts index 1ea8bd551e..1503725dc1 100644 --- a/src/user/email.ts +++ b/src/user/email.ts @@ -1,19 +1,20 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); +import nconf from 'nconf'; +import winston from 'winston'; -const user = require('./index'); -const utils = require('../utils'); -const plugins = require('../plugins'); -const db = require('../database'); -const meta = require('../meta'); -const emailer = require('../emailer'); -const groups = require('../groups'); -const events = require('../events'); +import user from './index'; +import utils from '../utils'; +import plugins from '../plugins'; +import db from '../database'; +import meta from '../meta'; -const UserEmail = module.exports; +import emailer from '../emailer'; +import groups from '../groups'; +import events from '../events'; + +const UserEmail = {} as any; UserEmail.exists = async function (email) { const uid = await user.getUidByEmail(email.toLowerCase()); @@ -210,3 +211,5 @@ UserEmail.confirmByUid = async function (uid) { ]); await plugins.hooks.fire('action:user.email.confirmed', { uid: uid, email: currentEmail }); }; + +export default UserEmail; \ No newline at end of file diff --git a/src/user/follow.ts b/src/user/follow.ts index f3b031a582..03c99f964a 100644 --- a/src/user/follow.ts +++ b/src/user/follow.ts @@ -1,10 +1,10 @@ 'use strict'; -const plugins = require('../plugins'); -const db = require('../database'); +import plugins from '../plugins'; +import db from '../database'; -module.exports = function (User) { +export default function (User) { User.follow = async function (uid, followuid) { await toggleFollow('follow', uid, followuid); }; diff --git a/src/user/index.ts b/src/user/index.ts index 25f90c906b..90d65c1ead 100644 --- a/src/user/index.ts +++ b/src/user/index.ts @@ -1,45 +1,75 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; -const groups = require('../groups'); -const plugins = require('../plugins'); -const db = require('../database'); -const privileges = require('../privileges'); -const categories = require('../categories'); -const meta = require('../meta'); -const utils = require('../utils'); +import groups from '../groups'; +import plugins from '../plugins'; +import db from '../database'; +import privileges from '../privileges'; +import categories from '../categories'; +import meta from '../meta'; -const User = module.exports; +import utils from '../utils'; -User.email = require('./email'); -User.notifications = require('./notifications'); -User.reset = require('./reset'); -User.digest = require('./digest'); -User.interstitials = require('./interstitials'); +const User = {} as any; -require('./data')(User); -require('./auth')(User); -require('./bans')(User); -require('./create')(User); -require('./posts')(User); -require('./topics')(User); -require('./categories')(User); -require('./follow')(User); -require('./profile')(User); -require('./admin')(User); -require('./delete')(User); -require('./settings')(User); -require('./search')(User); -require('./jobs')(User); -require('./picture')(User); -require('./approval')(User); -require('./invite')(User); -require('./password')(User); -require('./info')(User); -require('./online')(User); -require('./blocks')(User); -require('./uploads')(User); +import email from './email'; +import notifications from './notifications'; +import reset from './reset'; +import digest from './digest'; +import interstitials from './interstitials'; + +User.email = email; +User.notifications = notifications; +User.reset = reset; +User.digest = digest; +User.interstitials = interstitials; + +import data from './data'; +import auth from './auth'; +import bans from './bans'; +import create from './create'; +import posts from './posts'; +import topics from './topics'; +import categoriesUser from './categories'; +import follow from './follow'; +import admin from './admin'; +import deleteUser from './delete'; +import profile from './profile'; +import settings from './settings'; +import search from './search'; +import jobs from './jobs'; +import picture from './picture'; +import approval from './approval'; +import invite from './invite'; +import password from './password'; +import info from './info'; +import online from './online'; +import blocks from './blocks'; +import uploads from './uploads'; + +data(User); +auth(User); +bans(User); +create(User); +posts(User); +topics(User); +categoriesUser(User); +follow(User); +profile(User); +admin(User); +deleteUser(User); +settings(User); +search(User); +jobs(User); +picture(User); +approval(User); +invite(User); +password(User); +info(User); +online(User); +blocks(User); +uploads(User); User.exists = async function (uids) { return await ( @@ -245,4 +275,7 @@ User.addInterstitials = function (callback) { callback(); }; -require('../promisify')(User); +import promisify from '../promisify'; +promisify(User); + +export default User; \ No newline at end of file diff --git a/src/user/info.ts b/src/user/info.ts index 3abd580d02..b6bf86a242 100644 --- a/src/user/info.ts +++ b/src/user/info.ts @@ -1,14 +1,13 @@ 'use strict'; -const _ = require('lodash'); -const validator = require('validator'); +import _ from 'lodash'; +import validator from 'validator'; +import db from '../database'; +import posts from '../posts'; +import topics from '../topics'; +import utils from '../utils'; -const db = require('../database'); -const posts = require('../posts'); -const topics = require('../topics'); -const utils = require('../utils'); - -module.exports = function (User) { +export default function (User) { User.getLatestBanInfo = async function (uid) { // Simply retrieves the last record of the user's ban, even if they've been unbanned since then. const record = await db.getSortedSetRevRange(`uid:${uid}:bans:timestamp`, 0, 0); diff --git a/src/user/interstitials.ts b/src/user/interstitials.ts index 8ae5975c46..7fe991ddb7 100644 --- a/src/user/interstitials.ts +++ b/src/user/interstitials.ts @@ -1,18 +1,19 @@ 'use strict'; -const winston = require('winston'); -const util = require('util'); +import winston from 'winston'; +import util from 'util'; -const user = require('.'); -const db = require('../database'); -const meta = require('../meta'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import user from '.'; +import db from '../database'; +import meta from '../meta'; + +import privileges from '../privileges'; +import plugins from '../plugins'; +import utils from '../utils'; const sleep = util.promisify(setTimeout); -const Interstitials = module.exports; +const Interstitials = {} as any; Interstitials.get = async (req, userData) => plugins.hooks.fire('filter:register.interstitial', { req, @@ -202,3 +203,5 @@ Interstitials.tou = async function (data) { }); return data; }; + +export default Interstitials; \ No newline at end of file diff --git a/src/user/invite.ts b/src/user/invite.ts index a4e175b85e..f76c9ee679 100644 --- a/src/user/invite.ts +++ b/src/user/invite.ts @@ -1,19 +1,20 @@ 'use strict'; -const async = require('async'); -const nconf = require('nconf'); -const validator = require('validator'); +import async from 'async'; +import nconf from 'nconf'; +import validator from 'validator'; -const db = require('../database'); -const meta = require('../meta'); -const emailer = require('../emailer'); -const groups = require('../groups'); -const translator = require('../translator'); -const utils = require('../utils'); -const plugins = require('../plugins'); +import db from '../database'; +import meta from '../meta'; -module.exports = function (User) { +import emailer from '../emailer'; +import groups from '../groups'; +import translator from '../translator'; +import utils from '../utils'; +import plugins from '../plugins'; + +export default function (User) { User.getInvites = async function (uid) { const emails = await db.getSetMembers(`invitation:uid:${uid}`); return emails.map(email => validator.escape(String(email))); @@ -88,8 +89,7 @@ module.exports = function (User) { try { groupsToJoin = JSON.parse(groupsToJoin); - } catch (e) { - return; + } catch (e: any) { return; } if (!groupsToJoin || groupsToJoin.length < 1) { diff --git a/src/user/jobs.ts b/src/user/jobs.ts index 34c797e9e5..dc54ad7287 100644 --- a/src/user/jobs.ts +++ b/src/user/jobs.ts @@ -1,13 +1,15 @@ 'use strict'; -const winston = require('winston'); -const cronJob = require('cron').CronJob; -const db = require('../database'); -const meta = require('../meta'); +import winston from 'winston'; +import { CronJob } from 'cron'; +const cronJob = CronJob; +import db from '../database'; +import meta from '../meta'; + const jobs = {}; -module.exports = function (User) { +export default function (User) { User.startJobs = function () { winston.verbose('[user/jobs] (Re-)starting jobs...'); @@ -43,7 +45,7 @@ module.exports = function (User) { } } await User.digest.execute({ interval: term }); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }), null, true); diff --git a/src/user/jobs/export-posts.ts b/src/user/jobs/export-posts.ts index 3f1e39b170..a8d042a9ad 100644 --- a/src/user/jobs/export-posts.ts +++ b/src/user/jobs/export-posts.ts @@ -1,36 +1,38 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; nconf.argv().env({ separator: '__', }); -const fs = require('fs'); -const path = require('path'); -const json2csvAsync = require('json2csv').parseAsync; +import fs from 'fs'; +import path from 'path'; +import json2csvPkg from 'json2csv'; -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; +const json2csvAsync = json2csvPkg.parseAsync; + +(process as any).env.NODE_ENV = (process as any).env.NODE_ENV || 'production'; // Alternate configuration file support const configFile = path.resolve(__dirname, '../../../', nconf.any(['config', 'CONFIG']) || 'config.json'); -const prestart = require('../../prestart'); +import * as prestart from '../../prestart'; prestart.loadConfig(configFile); prestart.setupWinston(); -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; +import * as batch from '../../batch'; +import posts from '../../posts'; -process.on('message', async (msg) => { + +(process as any).on('message', async (msg: any) => { if (msg && msg.uid) { await db.init(); const targetUid = msg.uid; const filePath = path.join(__dirname, '../../../build/export', `${targetUid}_posts.csv`); - const posts = require('../../posts'); - let payload = []; await batch.processSortedSet(`uid:${targetUid}:posts`, async (pids) => { let postData = await posts.getPostsData(pids); @@ -51,6 +53,6 @@ process.on('message', async (msg) => { await fs.promises.writeFile(filePath, csv); await db.close(); - process.exit(0); + (process as any).exit(0); } }); diff --git a/src/user/jobs/export-profile.ts b/src/user/jobs/export-profile.ts index 49c18550ca..1c6874cc36 100644 --- a/src/user/jobs/export-profile.ts +++ b/src/user/jobs/export-profile.ts @@ -1,28 +1,31 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; nconf.argv().env({ separator: '__', }); -const fs = require('fs'); -const path = require('path'); -const _ = require('lodash'); +import fs from 'fs'; +import path from 'path'; +import _ from 'lodash'; +import * as prestart from '../../prestart'; -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; + +(process as any).env.NODE_ENV = (process as any).env.NODE_ENV || 'production'; // Alternate configuration file support const configFile = path.resolve(__dirname, '../../../', nconf.any(['config', 'CONFIG']) || 'config.json'); -const prestart = require('../../prestart'); prestart.loadConfig(configFile); prestart.setupWinston(); -const db = require('../../database'); -const batch = require('../../batch'); +import db from '../../database'; +import * as batch from '../../batch'; +import user from '../index'; +import privileges from '../../privileges'; -process.on('message', async (msg) => { +(process as any).on('message', async (msg: any) => { if (msg && msg.uid) { await db.init(); await db.initSessionStore(); @@ -32,7 +35,6 @@ process.on('message', async (msg) => { const profileFile = `${targetUid}_profile.json`; const profilePath = path.join(__dirname, '../../../build/export', profileFile); - const user = require('../index'); const [ userData, userSettings, @@ -82,12 +84,11 @@ process.on('message', async (msg) => { }, null, 4)); await db.close(); - process.exit(0); + (process as any).exit(0); } }); async function getRoomMessages(uid, roomId) { - const batch = require('../../batch'); let data = []; await batch.processSortedSet(`uid:${uid}:chat:room:${roomId}:mids`, async (mids) => { const messageData = await db.getObjects(mids.map(mid => `message:${mid}`)); @@ -101,8 +102,6 @@ async function getRoomMessages(uid, roomId) { } async function getSetData(set, keyPrefix, uid) { - const privileges = require('../../privileges'); - const batch = require('../../batch'); let data = []; await batch.processSortedSet(set, async (ids) => { if (keyPrefix === 'post:') { diff --git a/src/user/jobs/export-uploads.ts b/src/user/jobs/export-uploads.ts index a3bc097a49..9c49744529 100644 --- a/src/user/jobs/export-uploads.ts +++ b/src/user/jobs/export-uploads.ts @@ -1,28 +1,30 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; nconf.argv().env({ separator: '__', }); -const fs = require('fs'); -const path = require('path'); -const archiver = require('archiver'); -const winston = require('winston'); +import fs from 'fs'; +import path from 'path'; +import archiver from 'archiver'; +import winston from 'winston'; -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; +(process as any).env.NODE_ENV = (process as any).env.NODE_ENV || 'production'; // Alternate configuration file support const configFile = path.resolve(__dirname, '../../../', nconf.any(['config', 'CONFIG']) || 'config.json'); -const prestart = require('../../prestart'); +import * as prestart from '../../prestart'; +import user from '../index'; + prestart.loadConfig(configFile); prestart.setupWinston(); -const db = require('../../database'); +import db from '../../database'; -process.on('message', async (msg) => { +(process as any).on('message', async (msg: any) => { if (msg && msg.uid) { await db.init(); @@ -31,7 +33,6 @@ process.on('message', async (msg) => { const archivePath = path.join(__dirname, '../../../build/export', `${targetUid}_uploads.zip`); const rootDirectory = path.join(__dirname, '../../../public/uploads/'); - const user = require('../index'); const archive = archiver('zip', { zlib: { level: 9 }, // Sets the compression level. @@ -67,7 +68,7 @@ process.on('message', async (msg) => { const output = fs.createWriteStream(archivePath); output.on('close', async () => { await db.close(); - process.exit(0); + (process as any).exit(0); }); archive.pipe(output); diff --git a/src/user/notifications.ts b/src/user/notifications.ts index 57617cc5d5..3c146c98e8 100644 --- a/src/user/notifications.ts +++ b/src/user/notifications.ts @@ -1,17 +1,20 @@ 'use strict'; -const winston = require('winston'); -const _ = require('lodash'); +import winston from 'winston'; +import _ from 'lodash'; -const db = require('../database'); -const meta = require('../meta'); -const notifications = require('../notifications'); -const privileges = require('../privileges'); -const plugins = require('../plugins'); -const utils = require('../utils'); +import db from '../database'; +import meta from '../meta'; -const UserNotifications = module.exports; +import notifications from '../notifications'; +import privileges from '../privileges'; +import plugins from '../plugins'; +import utils from '../utils'; +import websockets from '../socket.io'; + + +const UserNotifications = {} as any; UserNotifications.get = async function (uid) { if (parseInt(uid, 10) <= 0) { @@ -194,7 +197,7 @@ UserNotifications.sendTopicNotificationToFollowers = async function (uid, topicD }); await notifications.push(notifObj, followers); - } catch (err) { + } catch (err: any) { winston.error(err.stack); } }; @@ -227,7 +230,8 @@ UserNotifications.sendNameChangeNotification = async function (uid, username) { }; UserNotifications.pushCount = async function (uid) { - const websockets = require('../socket.io'); const count = await UserNotifications.getUnreadCount(uid); websockets.in(`uid_${uid}`).emit('event:notifications.updateCount', count); }; + +export default UserNotifications; \ No newline at end of file diff --git a/src/user/online.ts b/src/user/online.ts index ffba4c9a94..3647ca19b2 100644 --- a/src/user/online.ts +++ b/src/user/online.ts @@ -1,11 +1,12 @@ 'use strict'; -const db = require('../database'); -const topics = require('../topics'); -const plugins = require('../plugins'); -const meta = require('../meta'); +import db from '../database'; +import topics from '../topics'; +import plugins from '../plugins'; +import meta from '../meta'; -module.exports = function (User) { + +export default function (User) { User.updateLastOnlineTime = async function (uid) { if (!(parseInt(uid, 10) > 0)) { return; diff --git a/src/user/password.ts b/src/user/password.ts index f70ba1aa13..ef031d29c1 100644 --- a/src/user/password.ts +++ b/src/user/password.ts @@ -1,12 +1,12 @@ 'use strict'; -const nconf = require('nconf'); +import nconf from 'nconf'; -const db = require('../database'); -const Password = require('../password'); +import db from '../database'; +import * as Password from '../password'; -module.exports = function (User) { +export default function (User) { User.hashPassword = async function (password) { if (!password) { return password; @@ -28,12 +28,11 @@ module.exports = function (User) { try { User.isPasswordValid(password, 0); - } catch (e) { - return false; + } catch (e: any) { return false; } await User.auth.logAttempt(uid, ip); - const ok = await Password.compare(password, hashedPassword, !!parseInt(shaWrapped, 10)); + const ok = await Password.compareFn(password, hashedPassword, !!parseInt(shaWrapped, 10)); if (ok) { await User.auth.clearLoginAttempts(uid); } diff --git a/src/user/picture.ts b/src/user/picture.ts index d3d2a22f68..5d36f83a81 100644 --- a/src/user/picture.ts +++ b/src/user/picture.ts @@ -1,16 +1,17 @@ 'use strict'; -const winston = require('winston'); -const mime = require('mime'); -const path = require('path'); -const nconf = require('nconf'); +import winston from 'winston'; +import mime from 'mime'; +import path from 'path'; +import nconf from 'nconf'; -const db = require('../database'); -const file = require('../file'); -const image = require('../image'); -const meta = require('../meta'); +import db from '../database'; +import file from '../file'; +import image from '../image'; +import meta from '../meta'; -module.exports = function (User) { + +export default function (User) { User.getAllowedProfileImageExtensions = function () { const exts = User.getAllowedImageTypes().map(type => mime.getExtension(type)); if (exts.includes('jpeg')) { @@ -37,7 +38,7 @@ module.exports = function (User) { const picture = { name: 'profileCover', uid: data.uid, - }; + } as any; try { if (!data.imageData && data.position) { @@ -116,7 +117,7 @@ module.exports = function (User) { const picture = { name: 'profileAvatar', uid: data.uid, - }; + } as any; try { if (!meta.config.allowProfileImageUploads) { diff --git a/src/user/posts.ts b/src/user/posts.ts index 9ca31cd6e7..d18a2afb68 100644 --- a/src/user/posts.ts +++ b/src/user/posts.ts @@ -1,10 +1,11 @@ 'use strict'; -const db = require('../database'); -const meta = require('../meta'); -const privileges = require('../privileges'); +import db from '../database'; +import meta from '../meta'; -module.exports = function (User) { +import privileges from '../privileges'; + +export default function (User) { User.isReadyToPost = async function (uid, cid) { await isReady(uid, cid, 'lastposttime'); }; @@ -32,7 +33,7 @@ module.exports = function (User) { const now = Date.now(); if (userData.mutedUntil > now) { - let muteLeft = ((userData.mutedUntil - now) / (1000 * 60)); + let muteLeft: number | string = ((userData.mutedUntil - now) / (1000 * 60)); if (muteLeft > 60) { muteLeft = (muteLeft / 60).toFixed(0); throw new Error(`[[error:user-muted-for-hours, ${muteLeft}]]`); diff --git a/src/user/profile.ts b/src/user/profile.ts index fc238ff87c..5626ea9b17 100644 --- a/src/user/profile.ts +++ b/src/user/profile.ts @@ -1,18 +1,19 @@ 'use strict'; -const _ = require('lodash'); -const validator = require('validator'); -const winston = require('winston'); +import _ from 'lodash'; +import validator from 'validator'; +import winston from 'winston'; -const utils = require('../utils'); -const slugify = require('../slugify'); -const meta = require('../meta'); -const db = require('../database'); -const groups = require('../groups'); -const plugins = require('../plugins'); +import utils from '../utils'; +import slugify from '../slugify'; +import meta from '../meta'; -module.exports = function (User) { +import db from '../database'; +import groups from '../groups'; +import plugins from '../plugins'; + +export default function (User) { User.updateProfile = async function (uid, data, extraFields) { let fields = [ 'username', 'email', 'fullname', 'website', 'location', @@ -95,7 +96,7 @@ module.exports = function (User) { } } - async function isUsernameAvailable(data, uid) { + async function isUsernameAvailable(data, uid?) { if (!data.username) { return; } diff --git a/src/user/reset.ts b/src/user/reset.ts index b8a77a4d08..0f220a1414 100644 --- a/src/user/reset.ts +++ b/src/user/reset.ts @@ -1,19 +1,20 @@ 'use strict'; -const nconf = require('nconf'); -const winston = require('winston'); +import nconf from 'nconf'; +import winston from 'winston'; -const user = require('./index'); -const groups = require('../groups'); -const utils = require('../utils'); -const batch = require('../batch'); +import user from './index'; +import groups from '../groups'; +import utils from '../utils'; +import * as batch from '../batch'; -const db = require('../database'); -const meta = require('../meta'); -const emailer = require('../emailer'); -const Password = require('../password'); +import db from '../database'; +import meta from '../meta'; -const UserReset = module.exports; +import emailer from '../emailer'; +import * as Password from '../password'; + +const UserReset = {} as any; const twoHours = 7200000; @@ -78,7 +79,7 @@ UserReset.commit = async function (code, password) { `user:${uid}`, ['password', 'passwordExpiry', 'password:shaWrapped'] ); - const ok = await Password.compare(password, userData.password, !!parseInt(userData['password:shaWrapped'], 10)); + const ok = await Password.compareFn(password, userData.password, !!parseInt(userData['password:shaWrapped'], 10)); if (ok) { throw new Error('[[error:reset-same-password]]'); } @@ -140,7 +141,7 @@ UserReset.cleanByUid = async function (uid) { await batch.processSortedSet('reset:issueDate', async (tokens) => { const results = await db.getObjectFields('reset:uid', tokens); - for (const [code, result] of Object.entries(results)) { + for (const [code, result] of Object.entries(results) as any) { if (parseInt(result, 10) === uid) { tokensToClean.push(code); } @@ -163,3 +164,5 @@ async function cleanTokensAndUids(tokens, uids) { db.sortedSetRemove('reset:issueDate:uid', uids), ]); } + +export default UserReset; \ No newline at end of file diff --git a/src/user/search.ts b/src/user/search.ts index 2713b3a8dd..d550b2473f 100644 --- a/src/user/search.ts +++ b/src/user/search.ts @@ -1,15 +1,16 @@ 'use strict'; -const _ = require('lodash'); +import _ from 'lodash'; -const meta = require('../meta'); -const plugins = require('../plugins'); -const db = require('../database'); -const groups = require('../groups'); -const utils = require('../utils'); +import meta from '../meta'; -module.exports = function (User) { +import plugins from '../plugins'; +import db from '../database'; +import groups from '../groups'; +import utils from '../utils'; + +export default function (User) { const filterFnMap = { online: user => user.status !== 'offline' && (Date.now() - user.lastonline < 300000), flagged: user => parseInt(user.flags, 10) > 0, @@ -32,7 +33,7 @@ module.exports = function (User) { const uid = data.uid || 0; const paginate = data.hasOwnProperty('paginate') ? data.paginate : true; - const startTime = process.hrtime(); + const startTime = (process as any).hrtime(); let uids = []; if (searchBy === 'ip') { @@ -50,7 +51,7 @@ module.exports = function (User) { const searchResult = { matchCount: uids.length, - }; + } as any; if (paginate) { const resultsPerPage = data.resultsPerPage || meta.config.userSearchResultsPerPage; @@ -61,7 +62,7 @@ module.exports = function (User) { } const userData = await User.getUsers(uids, uid); - searchResult.timing = (process.elapsedTimeSince(startTime) / 1000).toFixed(2); + searchResult.timing = ((process as any).elapsedTimeSince(startTime) / 1000).toFixed(2); searchResult.users = userData.filter(user => user && user.uid > 0); return searchResult; }; diff --git a/src/user/settings.ts b/src/user/settings.ts index cb982a4014..fe2f1a0f38 100644 --- a/src/user/settings.ts +++ b/src/user/settings.ts @@ -1,15 +1,16 @@ 'use strict'; -const validator = require('validator'); +import validator from 'validator'; -const meta = require('../meta'); -const db = require('../database'); -const plugins = require('../plugins'); -const notifications = require('../notifications'); -const languages = require('../languages'); +import meta from '../meta'; -module.exports = function (User) { +import db from '../database'; +import plugins from '../plugins'; +import notifications from '../notifications'; +import languages from '../languages'; + +export default function (User) { User.getSettings = async function (uid) { if (parseInt(uid, 10) <= 0) { return await onSettingsLoaded(0, {}); diff --git a/src/user/topics.ts b/src/user/topics.ts index 79d329cbc5..69cc1a09c5 100644 --- a/src/user/topics.ts +++ b/src/user/topics.ts @@ -1,8 +1,8 @@ 'use strict'; -const db = require('../database'); +import db from '../database'; -module.exports = function (User) { +export default function (User) { User.getIgnoredTids = async function (uid, start, stop) { return await db.getSortedSetRevRange(`uid:${uid}:ignored_tids`, start, stop); }; diff --git a/src/user/uploads.ts b/src/user/uploads.ts index 14c7a67b34..c57a606a2d 100644 --- a/src/user/uploads.ts +++ b/src/user/uploads.ts @@ -1,14 +1,14 @@ 'use strict'; -const path = require('path'); -const nconf = require('nconf'); -const winston = require('winston'); -const crypto = require('crypto'); +import path from 'path'; +import nconf from 'nconf'; +import winston from 'winston'; +import crypto from 'crypto'; -const db = require('../database'); -const posts = require('../posts'); -const file = require('../file'); -const batch = require('../batch'); +import db from '../database'; +import posts from '../posts'; +import file from '../file'; +import * as batch from '../batch'; const md5 = filename => crypto.createHash('md5').update(filename).digest('hex'); const _getFullPath = relativePath => path.resolve(nconf.get('upload_path'), relativePath); @@ -27,7 +27,7 @@ const _validatePath = async (relativePaths) => { } }; -module.exports = function (User) { +export default function (User) { User.associateUpload = async (uid, relativePath) => { await _validatePath(relativePath); await Promise.all([ diff --git a/src/utils.ts b/src/utils.ts index 2d0d2e7b9c..614a04bca1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,25 +1,29 @@ 'use strict'; -const crypto = require('crypto'); +import crypto from 'crypto'; +import sass from 'sass-embedded'; +import meta from './meta'; -process.profile = function (operation, start) { - console.log('%s took %d milliseconds', operation, process.elapsedTimeSince(start)); +(process as any).profile = function (operation, start) { + console.log('%s took %d milliseconds', operation, (process as any).elapsedTimeSince(start)); }; -process.elapsedTimeSince = function (start) { - const diff = process.hrtime(start); +(process as any).elapsedTimeSince = function (start) { + const diff = (process as any).hrtime(start); return (diff[0] * 1e3) + (diff[1] / 1e6); }; -const utils = { ...require('../public/src/utils.common') }; +//@ts-ignore +import utilsCommon from '../../public/src/utils.common'; + +const utils = { ...utilsCommon }; utils.getLanguage = function () { - const meta = require('./meta'); return meta.config && meta.config.defaultLang ? meta.config.defaultLang : 'en-GB'; }; utils.generateUUID = function () { // from https://github.com/tracker1/node-uuid4/blob/master/index.js - let rnd = crypto.randomBytes(16); + let rnd: any = crypto.randomBytes(16); /* eslint-disable no-bitwise */ rnd[6] = (rnd[6] & 0x0f) | 0x40; rnd[8] = (rnd[8] & 0x3f) | 0x80; @@ -31,11 +35,10 @@ utils.generateUUID = function () { utils.getSass = function () { try { - const sass = require('sass-embedded'); return sass; } catch (_err) { return require('sass'); } }; -module.exports = utils; +export default utils; diff --git a/src/webserver.ts b/src/webserver.ts index c0a1c8e537..6ccfa43a45 100644 --- a/src/webserver.ts +++ b/src/webserver.ts @@ -1,56 +1,68 @@ 'use strict'; -const fs = require('fs'); -const util = require('util'); -const path = require('path'); -const os = require('os'); -const nconf = require('nconf'); -const express = require('express'); -const chalk = require('chalk'); +import fs from 'fs'; +import util from 'util'; +import path from 'path'; +import os from 'os'; +import nconf from 'nconf'; +import express from 'express'; +import chalk from 'chalk'; + +const expressApp = express(); +(expressApp as any).renderAsync = util.promisify((tpl, data, callback) => expressApp.render(tpl, data, callback)); +let appServer: any; +import winston from 'winston'; +import flash from 'connect-flash'; +import bodyParser from 'body-parser'; +import cookieParser from 'cookie-parser'; +import session from 'express-session'; +import useragent from 'express-useragent'; +import favicon from 'serve-favicon'; +import detector from 'spider-detector'; +import helmet from 'helmet'; + +import Benchpress from 'benchpressjs'; +import db from './database'; + +import analytics from './analytics'; +import file from './file'; +import emailer from './emailer'; +import meta from './meta'; +import logger from './logger'; +import plugins from './plugins'; +import flags from './flags'; +import topicEvents from './topics/events'; +import privileges from './privileges'; +import routes from './routes'; +import auth from './routes/authentication'; +import middleware from './middleware'; +import compression from 'compression'; +import net from 'net'; +import toobusy from 'toobusy-js'; +import * as pingController from './controllers/ping'; +import appServerHttps from 'https'; +import appServerHttp from 'http'; +import als from './als'; +import controllerHelpers from './controllers/helpers'; + -const app = express(); -app.renderAsync = util.promisify((tpl, data, callback) => app.render(tpl, data, callback)); -let server; -const winston = require('winston'); -const flash = require('connect-flash'); -const bodyParser = require('body-parser'); -const cookieParser = require('cookie-parser'); -const session = require('express-session'); -const useragent = require('express-useragent'); -const favicon = require('serve-favicon'); -const detector = require('spider-detector'); -const helmet = require('helmet'); -const Benchpress = require('benchpressjs'); -const db = require('./database'); -const analytics = require('./analytics'); -const file = require('./file'); -const emailer = require('./emailer'); -const meta = require('./meta'); -const logger = require('./logger'); -const plugins = require('./plugins'); -const flags = require('./flags'); -const topicEvents = require('./topics/events'); -const privileges = require('./privileges'); -const routes = require('./routes'); -const auth = require('./routes/authentication'); -const helpers = require('./helpers'); if (nconf.get('ssl')) { - server = require('https').createServer({ + appServerHttps.createServer({ key: fs.readFileSync(nconf.get('ssl').key), cert: fs.readFileSync(nconf.get('ssl').cert), - }, app); + }, expressApp); } else { - server = require('http').createServer(app); + appServerHttp.createServer(expressApp); } -module.exports.server = server; -module.exports.app = app; +export const server = nconf.get('ssl') ? appServerHttps : appServerHttp; +export const app = expressApp; -server.on('error', (err) => { +appServer.on('error', (err) => { if (err.code === 'EADDRINUSE') { winston.error(`NodeBB address in use, exiting...\n${err.stack}`); } else { @@ -60,9 +72,9 @@ server.on('error', (err) => { throw err; }); -// see https://github.com/isaacs/server-destroy/blob/master/index.js +// see https://github.com/isaacs/appServer-destroy/blob/master/index.js const connections = {}; -server.on('connection', (conn) => { +appServer.on('connection', (conn) => { const key = `${conn.remoteAddress}:${conn.remotePort}`; connections[key] = conn; conn.on('close', () => { @@ -70,41 +82,44 @@ server.on('connection', (conn) => { }); }); -exports.destroy = function (callback) { - server.close(callback); - for (const connection of Object.values(connections)) { +export const destroy = function (callback) { + appServer.close(callback); + for (const connection of Object.values(connections) as any) { connection.destroy(); } }; -exports.listen = async function () { - emailer.registerApp(app); - setupExpressApp(app); - helpers.register(); - logger.init(app); +export const listen = async function () { + emailer.registerexpressApp(expressApp); + setupExpressexpressApp(expressApp); + controllerHelpers.register(); + logger.init(expressApp); await initializeNodeBB(); winston.info('🎉 NodeBB Ready'); - require('./socket.io').server.emit('event:nodebb.ready', { + require('./socket.io').appServer.emit('event:nodebb.ready', { 'cache-buster': meta.config['cache-buster'], hostname: os.hostname(), }); plugins.hooks.fire('action:nodebb.ready'); - await listen(); + await listen2(); }; async function initializeNodeBB() { - const middleware = require('./middleware'); await meta.themes.setupPaths(); - await plugins.init(app, middleware); + await plugins.init(expressApp, middleware); + notifications.startJobs(); + user.startJobs(); + plugins.startJobs(); + topics.scheduled.startJobs(); await plugins.hooks.fire('static:assets.prepare', {}); - await plugins.hooks.fire('static:app.preload', { - app: app, + await plugins.hooks.fire('static:expressApp.preload', { + expressApp: expressApp, middleware: middleware, }); - await routes(app, middleware); + await routes(expressApp, middleware); await privileges.init(); await meta.blacklist.load(); await flags.init(); @@ -112,36 +127,33 @@ async function initializeNodeBB() { await topicEvents.init(); } -function setupExpressApp(app) { - const middleware = require('./middleware'); - const pingController = require('./controllers/ping'); +function setupExpressexpressApp(expressApp) { const relativePath = nconf.get('relative_path'); const viewsDir = nconf.get('views_dir'); - app.engine('tpl', (filepath, data, next) => { + expressApp.engine('tpl', (filepath, data, next) => { filepath = filepath.replace(/\.tpl$/, '.js'); Benchpress.__express(filepath, data, next); }); - app.set('view engine', 'tpl'); - app.set('views', viewsDir); - app.set('json spaces', global.env === 'development' ? 4 : 0); - app.use(flash()); + expressApp.set('view engine', 'tpl'); + expressApp.set('views', viewsDir); + expressApp.set('json spaces', (global as any).env === 'development' ? 4 : 0); + expressApp.use(flash()); - app.enable('view cache'); + expressApp.enable('view cache'); - if (global.env !== 'development') { - app.enable('cache'); - app.enable('minification'); + if ((global as any).env !== 'development') { + expressApp.enable('cache'); + expressApp.enable('minification'); } if (meta.config.useCompression) { - const compression = require('compression'); - app.use(compression()); + expressApp.use(compression()); } if (relativePath) { - app.use((req, res, next) => { + expressApp.use((req, res, next) => { if (!req.path.startsWith(relativePath)) { return require('./controllers/helpers').redirect(res, req.path); } @@ -149,19 +161,19 @@ function setupExpressApp(app) { }); } - app.get(`${relativePath}/ping`, pingController.ping); - app.get(`${relativePath}/sping`, pingController.ping); + expressApp.get(`${relativePath}/ping`, pingController.ping); + expressApp.get(`${relativePath}/sping`, pingController.ping); - setupFavicon(app); + setupFavicon(expressApp); - app.use(`${relativePath}/apple-touch-icon`, middleware.routeTouchIcon); + expressApp.use(`${relativePath}/expressApple-touch-icon`, middleware.routeTouchIcon); - configureBodyParser(app); + configureBodyParser(expressApp); - app.use(cookieParser(nconf.get('secret'))); - app.use(useragent.express()); - app.use(detector.middleware()); - app.use(session({ + expressApp.use(cookieParser(nconf.get('secret'))); + expressApp.use(useragent.express()); + expressApp.use(detector.middleware()); + expressApp.use(session({ store: db.sessionStore, secret: nconf.get('secret'), key: nconf.get('sessionKey'), @@ -170,29 +182,27 @@ function setupExpressApp(app) { saveUninitialized: nconf.get('sessionSaveUninitialized') || false, })); - setupHelmet(app); + setupHelmet(expressApp); - app.use(middleware.addHeaders); - app.use(middleware.processRender); - auth.initialize(app, middleware); - const als = require('./als'); - app.use((req, res, next) => { + expressApp.use(middleware.addHeaders); + expressApp.use(middleware.processRender); + auth.initialize(expressApp, middleware); + expressApp.use((req, res, next) => { als.run({ uid: req.uid }, next); }); - app.use(middleware.autoLocale); // must be added after auth middlewares are added + expressApp.use(middleware.autoLocale); // must be added after auth middlewares are added - const toobusy = require('toobusy-js'); toobusy.maxLag(meta.config.eventLoopLagThreshold); toobusy.interval(meta.config.eventLoopInterval); } -function setupHelmet(app) { +function setupHelmet(expressApp) { const options = { contentSecurityPolicy: false, // defaults are too restrive and break plugins that load external assets... 🔜 crossOriginOpenerPolicy: { policy: meta.config['cross-origin-opener-policy'] }, crossOriginResourcePolicy: { policy: meta.config['cross-origin-resource-policy'] }, referrerPolicy: { policy: 'strict-origin-when-cross-origin' }, - }; + } as any; if (!meta.config['cross-origin-embedder-policy']) { options.crossOriginEmbedderPolicy = false; @@ -205,27 +215,27 @@ function setupHelmet(app) { }; } - app.use(helmet(options)); + expressApp.use(helmet(options)); } -function setupFavicon(app) { +function setupFavicon(expressApp) { let faviconPath = meta.config['brand:favicon'] || 'favicon.ico'; faviconPath = path.join(nconf.get('base_dir'), 'public', faviconPath.replace(/assets\/uploads/, 'uploads')); if (file.existsSync(faviconPath)) { - app.use(nconf.get('relative_path'), favicon(faviconPath)); + expressApp.use(nconf.get('relative_path'), favicon(faviconPath)); } } -function configureBodyParser(app) { +function configureBodyParser(expressApp) { const urlencodedOpts = nconf.get('bodyParser:urlencoded') || {}; if (!urlencodedOpts.hasOwnProperty('extended')) { urlencodedOpts.extended = true; } - app.use(bodyParser.urlencoded(urlencodedOpts)); + expressApp.use(bodyParser.urlencoded(urlencodedOpts)); const jsonOpts = nconf.get('bodyParser:json') || {}; - app.use(bodyParser.json(jsonOpts)); + expressApp.use(bodyParser.json(jsonOpts)); } function setupCookie() { @@ -236,7 +246,7 @@ function setupCookie() { return cookie; } -async function listen() { +async function listen2() { let port = nconf.get('port'); const isSocket = isNaN(port) && !Array.isArray(port); const socketPath = isSocket ? nconf.get('port') : ''; @@ -244,7 +254,7 @@ async function listen() { if (Array.isArray(port)) { if (!port.length) { winston.error('[startup] empty ports array in config.json'); - process.exit(); + (process as any).exit(); } winston.warn('[startup] If you want to start nodebb on multiple ports please use loader.js'); @@ -252,16 +262,16 @@ async function listen() { port = port[0]; if (!port) { winston.error('[startup] Invalid port, exiting'); - process.exit(); + (process as any).exit(); } } port = parseInt(port, 10); if ((port !== 80 && port !== 443) || nconf.get('trust_proxy') === true) { winston.info('🤝 Enabling \'trust proxy\''); - app.enable('trust proxy'); + expressApp.enable('trust proxy'); } - if ((port === 80 || port === 443) && process.env.NODE_ENV !== 'development') { + if ((port === 80 || port === 443) && (process as any).env.NODE_ENV !== 'development') { winston.info('Using ports 80 and 443 is not recommend; use a proxy instead. See README.md'); } @@ -270,17 +280,17 @@ async function listen() { let oldUmask; if (isSocket) { - oldUmask = process.umask('0000'); + oldUmask = (process as any).umask('0000'); try { - await exports.testSocket(socketPath); - } catch (err) { + await testSocket(socketPath); + } catch (err: any) { winston.error(`[startup] NodeBB was unable to secure domain socket access (${socketPath})\n${err.stack}`); throw err; } } - return new Promise((resolve, reject) => { - server.listen(...args.concat([function (err) { + return new Promise((resolve, reject) => { + appServer.listen(...args.concat([function (err) { const onText = `${isSocket ? socketPath : `${bind_address}:${port}`}`; if (err) { winston.error(`[startup] NodeBB was unable to listen on: ${chalk.yellow(onText)}`); @@ -290,26 +300,24 @@ async function listen() { winston.info(`📡 NodeBB is now listening on: ${chalk.yellow(onText)}`); winston.info(`🔗 Canonical URL: ${chalk.yellow(nconf.get('url'))}`); if (oldUmask) { - process.umask(oldUmask); + (process as any).umask(oldUmask); } resolve(); }])); }); } -exports.testSocket = async function (socketPath) { +export const testSocket = async function (socketPath) { if (typeof socketPath !== 'string') { throw new Error(`invalid socket path : ${socketPath}`); } - const net = require('net'); - const file = require('./file'); const exists = await file.exists(socketPath); if (!exists) { return; } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const testSocket = new net.Socket(); - testSocket.on('error', (err) => { + testSocket.on('error', (err: any) => { if (err.code !== 'ECONNREFUSED') { return reject(err); } @@ -325,4 +333,8 @@ exports.testSocket = async function (socketPath) { }); }; -require('./promisify')(exports); +import promisify from './promisify'; +import notifications from './notifications'; +import topics from './topics'; +import user from './user'; +promisify(exports); diff --git a/src/widgets/admin.ts b/src/widgets/admin.ts index d6e67f6917..374fbebdcf 100644 --- a/src/widgets/admin.ts +++ b/src/widgets/admin.ts @@ -1,11 +1,11 @@ 'use strict'; -const webserver = require('../webserver'); -const plugins = require('../plugins'); -const groups = require('../groups'); -const index = require('./index'); +import * as webserver from '../webserver'; +import plugins from '../plugins'; +import groups from '../groups'; +import index from './index'; -const admin = module.exports; +const admin = {} as any; admin.get = async function () { const [areas, availableWidgets] = await Promise.all([ @@ -54,6 +54,7 @@ async function getAvailableWidgets() { async function renderAdminTemplate() { const groupsData = await groups.getNonPrivilegeGroups('groups:createtime', 0, -1); groupsData.sort((a, b) => b.system - a.system); + //@ts-ignore return await webserver.app.renderAsync('admin/partials/widget-settings', { groups: groupsData }); } @@ -81,4 +82,7 @@ function buildTemplatesFromAreas(areas) { return templates; } -require('../promisify')(admin); +import promisify from '../promisify'; +promisify(admin); + +export default admin; \ No newline at end of file diff --git a/src/widgets/index.ts b/src/widgets/index.ts index 473a33a820..09a2696314 100644 --- a/src/widgets/index.ts +++ b/src/widgets/index.ts @@ -1,17 +1,18 @@ 'use strict'; -const winston = require('winston'); -const _ = require('lodash'); -const Benchpress = require('benchpressjs'); +import winston from 'winston'; +import _ from 'lodash'; +import Benchpress from 'benchpressjs'; -const plugins = require('../plugins'); -const groups = require('../groups'); -const translator = require('../translator'); -const db = require('../database'); -const apiController = require('../controllers/api'); -const meta = require('../meta'); +import plugins from '../plugins'; +import groups from '../groups'; +import translator from '../translator'; +import db from '../database'; +import apiController from '../controllers/api'; +import meta from '../meta'; -const widgets = module.exports; + +const widgets = {} as any; widgets.render = async function (uid, options) { if (!options.template) { @@ -120,7 +121,7 @@ widgets.getWidgetDataForTemplates = async function (templates) { if (templateWidgetData && templateWidgetData[location]) { try { returnData[template][location] = parseWidgetData(templateWidgetData[location]); - } catch (err) { + } catch (err: any) { winston.error(`can not parse widget data. template: ${template} location: ${location}`); returnData[template][location] = []; } @@ -228,4 +229,7 @@ widgets.resetTemplates = async function (templates) { } }; -require('../promisify')(widgets); +import promisify from '../promisify'; +promisify(widgets); + +export default widgets; diff --git a/test/helpers/index.js b/test/helpers/index.js index 6ca11e9252..c61e605e83 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -8,7 +8,7 @@ const winston = require('winston'); const utils = require('../../src/utils'); -const helpers = module.exports; +const helpers = {} as any; helpers.getCsrfToken = async (jar) => { const { csrf_token: token } = await requestAsync({ diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index d22e4c01b0..69862deff4 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -128,7 +128,7 @@ winston.info(`environment ${global.env}`); const db = require('../../src/database'); -module.exports = db; +module.exports = db; before(async function () { this.timeout(30000); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..97f43004ae --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + "outDir": "build", + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strictNullChecks": false, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitThis": false, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": false, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/webpack.common.js b/webpack.common.js index 0e67d874ee..bb88f18b11 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -16,7 +16,7 @@ if (relativePath === undefined) { relativePath = urlObject.pathname !== '/' ? urlObject.pathname.replace(/\/+$/, '') : ''; } -module.exports = { +module.exports = { plugins: [], entry: { nodebb: './build/public/src/client.js', diff --git a/webpack.dev.js b/webpack.dev.js index 9d29a03157..0de4c69034 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -3,7 +3,7 @@ const { merge } = require('webpack-merge'); const common = require('./webpack.common'); -module.exports = merge(common, { +module.exports = merge(common, { mode: 'development', // devtool: 'eval-source-map', }); diff --git a/webpack.installer.js b/webpack.installer.js index 8324669680..2880c4070b 100644 --- a/webpack.installer.js +++ b/webpack.installer.js @@ -4,7 +4,7 @@ const path = require('path'); -module.exports = { +module.exports = { mode: 'production', entry: { installer: './public/src/installer/install.js', diff --git a/webpack.prod.js b/webpack.prod.js index d5d5c8a1fe..f32660aa87 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -6,7 +6,7 @@ const ProgressPlugin = require('progress-webpack-plugin'); const common = require('./webpack.common'); -module.exports = merge(common, { +module.exports = merge(common, { mode: 'production', plugins: [ new ProgressPlugin(true),