From 245d6c3a3e52ba7da0c65aab01081ea38b830549 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Sat, 27 Feb 2021 15:53:59 -0800 Subject: [PATCH] js: Convert static/js/stream_data.js to ES6 module. Signed-off-by: Anders Kaseorg --- .eslintrc.json | 1 - .../node_tests/composebox_typeahead.js | 8 +- frontend_tests/node_tests/dispatch.js | 3 +- frontend_tests/node_tests/drafts.js | 2 +- frontend_tests/node_tests/markdown_katex.js | 1 - frontend_tests/node_tests/message_list.js | 3 +- frontend_tests/node_tests/narrow_local.js | 1 - frontend_tests/node_tests/popovers.js | 4 +- frontend_tests/node_tests/recent_topics.js | 2 +- .../node_tests/search_suggestion.js | 30 +- .../node_tests/search_suggestion_legacy.js | 30 +- frontend_tests/node_tests/settings_org.js | 12 +- frontend_tests/node_tests/stream_list.js | 16 +- frontend_tests/node_tests/topic_generator.js | 4 +- frontend_tests/node_tests/typeahead_helper.js | 2 +- frontend_tests/node_tests/ui_init.js | 1 - frontend_tests/node_tests/unread.js | 16 +- static/js/bundles/app.js | 1 - static/js/compose.js | 1 + static/js/compose_actions.js | 1 + static/js/compose_fade.js | 1 + static/js/composebox_typeahead.js | 1 + static/js/drafts.js | 1 + static/js/filter.js | 1 + static/js/global.d.ts | 1 - static/js/hash_util.js | 1 + static/js/invite.js | 1 + static/js/markdown_config.js | 1 + static/js/message_edit.js | 1 + static/js/message_events.js | 1 + static/js/message_fetch.js | 1 + static/js/message_list.js | 1 + static/js/message_list_view.js | 1 + static/js/muting.js | 1 + static/js/muting_ui.js | 1 + static/js/narrow.js | 1 + static/js/narrow_state.js | 1 + static/js/notifications.js | 1 + static/js/peer_data.js | 2 + static/js/recent_topics.js | 1 + static/js/rendered_markdown.js | 1 + static/js/search_suggestion.js | 1 + static/js/server_events_dispatch.js | 1 + static/js/settings_notifications.js | 1 + static/js/settings_org.js | 1 + static/js/settings_streams.js | 1 + static/js/stream_create.js | 1 + static/js/stream_data.js | 356 +++++++++--------- static/js/stream_edit.js | 1 + static/js/stream_events.js | 1 + static/js/stream_list.js | 1 + static/js/stream_pill.js | 1 + static/js/stream_popover.js | 1 + static/js/stream_sort.js | 1 + static/js/stream_topic_history.js | 1 + static/js/stream_ui_updates.js | 1 + static/js/subs.js | 1 + static/js/topic_generator.js | 1 + static/js/topic_list.js | 1 + static/js/typeahead_helper.js | 1 + static/js/ui_init.js | 1 + static/js/ui_util.js | 1 + static/js/unread.js | 1 + 63 files changed, 289 insertions(+), 249 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 23d89c649a..ea32f55d4e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -212,7 +212,6 @@ "settings_user_groups": false, "settings_users": false, "starred_messages": false, - "stream_data": false, "stream_edit": false, "stream_events": false, "stream_topic_history": false, diff --git a/frontend_tests/node_tests/composebox_typeahead.js b/frontend_tests/node_tests/composebox_typeahead.js index 69679f9898..18c014996a 100644 --- a/frontend_tests/node_tests/composebox_typeahead.js +++ b/frontend_tests/node_tests/composebox_typeahead.js @@ -58,8 +58,8 @@ const settings_config = zrequire("settings_config"); const pygments_data = zrequire("pygments_data", "generated/pygments_data.json"); // To be eliminated in next commit: -stream_data.update_calculated_fields = () => {}; -stream_data.set_filter_out_inactives = () => false; +stream_data.__Rewire__("update_calculated_fields", () => {}); +stream_data.__Rewire__("set_filter_out_inactives", () => false); const ct = composebox_typeahead; @@ -959,13 +959,13 @@ run_test("initialize", () => { subscribed: false, }; // Subscribed stream is active - stream_data.is_active = () => false; + stream_data.__Rewire__("is_active", () => false); fake_this = {completing: "stream", token: "s"}; actual_value = sort_items(fake_this, [sweden_stream, serbia_stream]); expected_value = [sweden_stream, serbia_stream]; assert.deepEqual(actual_value, expected_value); // Subscribed stream is inactive - stream_data.is_active = () => true; + stream_data.__Rewire__("is_active", () => true); actual_value = sort_items(fake_this, [sweden_stream, serbia_stream]); expected_value = [sweden_stream, serbia_stream]; assert.deepEqual(actual_value, expected_value); diff --git a/frontend_tests/node_tests/dispatch.js b/frontend_tests/node_tests/dispatch.js index 6fc7ea766c..d4d0102d4f 100644 --- a/frontend_tests/node_tests/dispatch.js +++ b/frontend_tests/node_tests/dispatch.js @@ -58,7 +58,8 @@ const settings_profile_fields = set_global("settings_profile_fields", {}); const settings_streams = set_global("settings_streams", {}); const settings_user_groups = set_global("settings_user_groups", {}); const settings_users = set_global("settings_users", {}); -const stream_data = set_global("stream_data", {}); +const stream_data = {__esModule: true}; +rewiremock("../../static/js/stream_data").with(stream_data); const stream_events = set_global("stream_events", {}); const submessage = {__esModule: true}; rewiremock("../../static/js/submessage").with(submessage); diff --git a/frontend_tests/node_tests/drafts.js b/frontend_tests/node_tests/drafts.js index 47ec968bb0..c684199093 100644 --- a/frontend_tests/node_tests/drafts.js +++ b/frontend_tests/node_tests/drafts.js @@ -29,7 +29,7 @@ const localStorage = set_global("localStorage", { rewiremock("../../static/js/compose").with({}); const compose_state = {__esModule: true}; rewiremock("../../static/js/compose_state").with(compose_state); -set_global("stream_data", { +rewiremock("../../static/js/stream_data").with({ get_color() { return "#FFFFFF"; }, diff --git a/frontend_tests/node_tests/markdown_katex.js b/frontend_tests/node_tests/markdown_katex.js index a611d0a637..85443d2a30 100644 --- a/frontend_tests/node_tests/markdown_katex.js +++ b/frontend_tests/node_tests/markdown_katex.js @@ -24,7 +24,6 @@ rewiremock.enable(); const markdown_config = zrequire("markdown_config"); zrequire("hash_util"); zrequire("message_store"); -zrequire("stream_data"); const markdown = zrequire("markdown"); diff --git a/frontend_tests/node_tests/message_list.js b/frontend_tests/node_tests/message_list.js index 0e35e37158..a2d2a8ea74 100644 --- a/frontend_tests/node_tests/message_list.js +++ b/frontend_tests/node_tests/message_list.js @@ -28,7 +28,8 @@ set_global("document", { const narrow_state = {__esModule: true}; rewiremock("../../static/js/narrow_state").with(narrow_state); -const stream_data = set_global("stream_data", {}); +const stream_data = {__esModule: true}; +rewiremock("../../static/js/stream_data").with(stream_data); set_global("recent_topics", { is_visible: () => false, }); diff --git a/frontend_tests/node_tests/narrow_local.js b/frontend_tests/node_tests/narrow_local.js index ea139a2823..e0b034e0a0 100644 --- a/frontend_tests/node_tests/narrow_local.js +++ b/frontend_tests/node_tests/narrow_local.js @@ -18,7 +18,6 @@ const {Filter} = zrequire("Filter", "js/filter"); const {MessageListData} = zrequire("MessageListData", "js/message_list_data"); const narrow_state = zrequire("narrow_state"); const narrow = zrequire("narrow"); -zrequire("stream_data"); function test_with(fixture) { const filter = new Filter(fixture.filter_terms); diff --git a/frontend_tests/node_tests/popovers.js b/frontend_tests/node_tests/popovers.js index 8624f93747..2e8171292c 100644 --- a/frontend_tests/node_tests/popovers.js +++ b/frontend_tests/node_tests/popovers.js @@ -37,7 +37,9 @@ set_global("stream_popover", { hide_streamlist_sidebar: noop, }); -const stream_data = set_global("stream_data", {}); +const stream_data = {__esModule: true}; + +rewiremock("../../static/js/stream_data").with(stream_data); const ClipboardJS = noop; rewiremock("clipboard").with(ClipboardJS); diff --git a/frontend_tests/node_tests/recent_topics.js b/frontend_tests/node_tests/recent_topics.js index 00025a2a1f..56775df2e8 100644 --- a/frontend_tests/node_tests/recent_topics.js +++ b/frontend_tests/node_tests/recent_topics.js @@ -145,7 +145,7 @@ set_global("message_list", { set_global("message_store", { get: (msg_id) => messages[msg_id - 1], }); -set_global("stream_data", { +rewiremock("../../static/js/stream_data").with({ get_sub_by_id: (stream) => { if (stream === stream5) { // No data is available for deactivated streams diff --git a/frontend_tests/node_tests/search_suggestion.js b/frontend_tests/node_tests/search_suggestion.js index a0bfe2900e..0e5496d7ef 100644 --- a/frontend_tests/node_tests/search_suggestion.js +++ b/frontend_tests/node_tests/search_suggestion.js @@ -86,7 +86,7 @@ function get_suggestions(base_query, query) { run_test("basic_get_suggestions", () => { const query = "fred"; - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => "office"); @@ -100,7 +100,7 @@ run_test("subset_suggestions", () => { const query = "shakespeare"; const base_query = "stream:Denmark topic:Hamlet"; - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -112,7 +112,7 @@ run_test("subset_suggestions", () => { }); run_test("private_suggestions", () => { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -229,7 +229,7 @@ run_test("private_suggestions", () => { }); run_test("group_suggestions", () => { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -370,7 +370,7 @@ init(); run_test("empty_query_suggestions", () => { const query = ""; - stream_data.subscribed_streams = () => ["devel", "office"]; + stream_data.__Rewire__("subscribed_streams", () => ["devel", "office"]); narrow_state.__Rewire__("stream", () => {}); @@ -412,7 +412,7 @@ run_test("has_suggestions", () => { // Checks that category wise suggestions are displayed instead of a single // default suggestion when suggesting `has` operator. let query = "h"; - stream_data.subscribed_streams = () => ["devel", "office"]; + stream_data.__Rewire__("subscribed_streams", () => ["devel", "office"]); narrow_state.__Rewire__("stream", () => {}); let suggestions = get_suggestions("", query); @@ -466,7 +466,7 @@ run_test("has_suggestions", () => { run_test("check_is_suggestions", () => { let query = "i"; - stream_data.subscribed_streams = () => ["devel", "office"]; + stream_data.__Rewire__("subscribed_streams", () => ["devel", "office"]); narrow_state.__Rewire__("stream", () => {}); let suggestions = get_suggestions("", query); @@ -569,7 +569,7 @@ run_test("check_is_suggestions", () => { }); run_test("sent_by_me_suggestions", () => { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -648,14 +648,14 @@ run_test("topic_suggestions", () => { let suggestions; let expected; - stream_data.subscribed_streams = () => ["office"]; + stream_data.__Rewire__("subscribed_streams", () => ["office"]); narrow_state.__Rewire__("stream", () => "office"); const devel_id = 44; const office_id = 77; - stream_data.get_stream_id = (stream_name) => { + stream_data.__Rewire__("get_stream_id", (stream_name) => { switch (stream_name) { case "office": return office_id; @@ -664,7 +664,7 @@ run_test("topic_suggestions", () => { default: return undefined; } - }; + }); stream_topic_history.reset(); suggestions = get_suggestions("", "te"); @@ -737,7 +737,7 @@ run_test("topic_suggestions", () => { run_test("whitespace_glitch", () => { const query = "stream:office "; // note trailing space - stream_data.subscribed_streams = () => ["office"]; + stream_data.__Rewire__("subscribed_streams", () => ["office"]); narrow_state.__Rewire__("stream", () => {}); @@ -751,7 +751,7 @@ run_test("whitespace_glitch", () => { }); run_test("stream_completion", () => { - stream_data.subscribed_streams = () => ["office", "dev help"]; + stream_data.__Rewire__("subscribed_streams", () => ["office", "dev help"]); narrow_state.__Rewire__("stream", () => {}); @@ -774,7 +774,7 @@ run_test("stream_completion", () => { }); function people_suggestion_setup() { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", noop); const ted = { @@ -921,7 +921,7 @@ run_test("operator_suggestions", () => { }); run_test("queries_with_spaces", () => { - stream_data.subscribed_streams = () => ["office", "dev help"]; + stream_data.__Rewire__("subscribed_streams", () => ["office", "dev help"]); narrow_state.__Rewire__("stream", () => {}); diff --git a/frontend_tests/node_tests/search_suggestion_legacy.js b/frontend_tests/node_tests/search_suggestion_legacy.js index e60a20e9bd..8e4db165ae 100644 --- a/frontend_tests/node_tests/search_suggestion_legacy.js +++ b/frontend_tests/node_tests/search_suggestion_legacy.js @@ -82,7 +82,7 @@ function get_suggestions(base_query, query) { run_test("basic_get_suggestions", () => { const query = "fred"; - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => "office"); @@ -95,7 +95,7 @@ run_test("basic_get_suggestions", () => { run_test("subset_suggestions", () => { const query = "stream:Denmark topic:Hamlet shakespeare"; - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -111,7 +111,7 @@ run_test("subset_suggestions", () => { }); run_test("private_suggestions", () => { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -224,7 +224,7 @@ run_test("private_suggestions", () => { }); run_test("group_suggestions", () => { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -372,7 +372,7 @@ init(); run_test("empty_query_suggestions", () => { const query = ""; - stream_data.subscribed_streams = () => ["devel", "office"]; + stream_data.__Rewire__("subscribed_streams", () => ["devel", "office"]); narrow_state.__Rewire__("stream", () => {}); @@ -414,7 +414,7 @@ run_test("has_suggestions", () => { // Checks that category wise suggestions are displayed instead of a single // default suggestion when suggesting `has` operator. let query = "h"; - stream_data.subscribed_streams = () => ["devel", "office"]; + stream_data.__Rewire__("subscribed_streams", () => ["devel", "office"]); narrow_state.__Rewire__("stream", () => {}); let suggestions = get_suggestions("", query); @@ -470,7 +470,7 @@ run_test("has_suggestions", () => { }); run_test("check_is_suggestions", () => { - stream_data.subscribed_streams = () => ["devel", "office"]; + stream_data.__Rewire__("subscribed_streams", () => ["devel", "office"]); narrow_state.__Rewire__("stream", () => {}); let query = "i"; @@ -539,7 +539,7 @@ run_test("check_is_suggestions", () => { }); run_test("sent_by_me_suggestions", () => { - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -613,14 +613,14 @@ run_test("topic_suggestions", () => { let suggestions; let expected; - stream_data.subscribed_streams = () => ["office"]; + stream_data.__Rewire__("subscribed_streams", () => ["office"]); narrow_state.__Rewire__("stream", () => "office"); const devel_id = 44; const office_id = 77; - stream_data.get_stream_id = (stream_name) => { + stream_data.__Rewire__("get_stream_id", (stream_name) => { switch (stream_name) { case "office": return office_id; @@ -629,7 +629,7 @@ run_test("topic_suggestions", () => { default: return undefined; } - }; + }); stream_topic_history.reset(); suggestions = get_suggestions("", "te"); @@ -708,7 +708,7 @@ run_test("topic_suggestions", () => { run_test("whitespace_glitch", () => { const query = "stream:office "; // note trailing space - stream_data.subscribed_streams = () => ["office"]; + stream_data.__Rewire__("subscribed_streams", () => ["office"]); narrow_state.__Rewire__("stream", () => {}); @@ -722,7 +722,7 @@ run_test("whitespace_glitch", () => { }); run_test("stream_completion", () => { - stream_data.subscribed_streams = () => ["office", "dev help"]; + stream_data.__Rewire__("subscribed_streams", () => ["office", "dev help"]); narrow_state.__Rewire__("stream", () => {}); @@ -747,7 +747,7 @@ run_test("stream_completion", () => { run_test("people_suggestions", () => { let query = "te"; - stream_data.subscribed_streams = () => []; + stream_data.__Rewire__("subscribed_streams", () => []); narrow_state.__Rewire__("stream", () => {}); @@ -861,7 +861,7 @@ run_test("operator_suggestions", () => { }); run_test("queries_with_spaces", () => { - stream_data.subscribed_streams = () => ["office", "dev help"]; + stream_data.__Rewire__("subscribed_streams", () => ["office", "dev help"]); narrow_state.__Rewire__("stream", () => {}); diff --git a/frontend_tests/node_tests/settings_org.js b/frontend_tests/node_tests/settings_org.js index a20d889aad..7d8e054887 100644 --- a/frontend_tests/node_tests/settings_org.js +++ b/frontend_tests/node_tests/settings_org.js @@ -1000,10 +1000,10 @@ run_test("misc", () => { settings_account.update_email_change_display(); assert(!$("#change_email .button").prop("disabled")); - stream_data.get_streams_for_settings_page = () => [ + stream_data.__Rewire__("get_streams_for_settings_page", () => [ {name: "some_stream", stream_id: 75}, {name: "some_stream", stream_id: 42}, - ]; + ]); // Set stubs for dropdown_list_widget: const widget_settings = [ @@ -1032,10 +1032,10 @@ run_test("misc", () => { let setting_name = "realm_notifications_stream_id"; let elem = $(`#${CSS.escape(setting_name)}_widget #${CSS.escape(setting_name)}_name`); elem.closest = () => stub_notification_disable_parent; - stream_data.get_sub_by_id = (stream_id) => { + stream_data.__Rewire__("get_sub_by_id", (stream_id) => { assert.equal(stream_id, 42); return {name: "some_stream"}; - }; + }); settings_org.notifications_stream_widget.render(42); assert.equal(elem.text(), "#some_stream"); assert(!elem.hasClass("text-warning")); @@ -1047,10 +1047,10 @@ run_test("misc", () => { setting_name = "realm_signup_notifications_stream_id"; elem = $(`#${CSS.escape(setting_name)}_widget #${CSS.escape(setting_name)}_name`); elem.closest = () => stub_notification_disable_parent; - stream_data.get_sub_by_id = (stream_id) => { + stream_data.__Rewire__("get_sub_by_id", (stream_id) => { assert.equal(stream_id, 75); return {name: "some_stream"}; - }; + }); settings_org.signup_notifications_stream_widget.render(75); assert.equal(elem.text(), "#some_stream"); assert(!elem.hasClass("text-warning")); diff --git a/frontend_tests/node_tests/stream_list.js b/frontend_tests/node_tests/stream_list.js index 30962199d9..0212ac08e4 100644 --- a/frontend_tests/node_tests/stream_list.js +++ b/frontend_tests/node_tests/stream_list.js @@ -172,11 +172,11 @@ test_ui("create_sidebar_row", (override) => { assert(!social_li.hasClass("out_of_home_view")); const row = stream_list.stream_sidebar.get_row(stream_id); - stream_data.is_active = () => true; + stream_data.__Rewire__("is_active", () => true); row.update_whether_active(); assert(!social_li.hasClass("inactive_stream")); - stream_data.is_active = () => false; + stream_data.__Rewire__("is_active", () => false); row.update_whether_active(); assert(social_li.hasClass("inactive_stream")); @@ -202,16 +202,16 @@ test_ui("pinned_streams_never_inactive", (override) => { const social_sidebar = $(""); let stream_id = social.stream_id; let row = stream_list.stream_sidebar.get_row(stream_id); - stream_data.is_active = () => false; + stream_data.__Rewire__("is_active", () => false); stream_list.build_stream_list(); assert(social_sidebar.hasClass("inactive_stream")); - stream_data.is_active = () => true; + stream_data.__Rewire__("is_active", () => true); row.update_whether_active(); assert(!social_sidebar.hasClass("inactive_stream")); - stream_data.is_active = () => false; + stream_data.__Rewire__("is_active", () => false); row.update_whether_active(); assert(social_sidebar.hasClass("inactive_stream")); @@ -219,7 +219,7 @@ test_ui("pinned_streams_never_inactive", (override) => { const devel_sidebar = $(""); stream_id = devel.stream_id; row = stream_list.stream_sidebar.get_row(stream_id); - stream_data.is_active = () => false; + stream_data.__Rewire__("is_active", () => false); stream_list.build_stream_list(); assert(!devel_sidebar.hasClass("inactive_stream")); @@ -464,7 +464,7 @@ test_ui("sort_streams", () => { initialize_stream_data(); - stream_data.is_active = (sub) => sub.name !== "cars"; + stream_data.__Rewire__("is_active", (sub) => sub.name !== "cars"); let appended_elems; $("#stream_filters").append = (elems) => { @@ -542,7 +542,7 @@ test_ui("separators_only_pinned_and_dormant", () => { }; add_row(DenmarkSub); - stream_data.is_active = (sub) => sub.name !== "Denmark"; + stream_data.__Rewire__("is_active", (sub) => sub.name !== "Denmark"); let appended_elems; $("#stream_filters").append = (elems) => { diff --git a/frontend_tests/node_tests/topic_generator.js b/frontend_tests/node_tests/topic_generator.js index c0849f7a36..a34c7079cd 100644 --- a/frontend_tests/node_tests/topic_generator.js +++ b/frontend_tests/node_tests/topic_generator.js @@ -96,9 +96,9 @@ run_test("topics", () => { return []; }; - stream_data.get_stream_id = (stream_name) => stream_id_dct[stream_name]; + stream_data.__Rewire__("get_stream_id", (stream_name) => stream_id_dct[stream_name]); - stream_data.is_stream_muted_by_name = (stream_name) => stream_name === "muted"; + stream_data.__Rewire__("is_stream_muted_by_name", (stream_name) => stream_name === "muted"); unread.topic_has_any_unread = (stream_id) => [devel_stream_id, muted_stream_id].includes(stream_id); diff --git a/frontend_tests/node_tests/typeahead_helper.js b/frontend_tests/node_tests/typeahead_helper.js index b1f00fa02c..289adc951a 100644 --- a/frontend_tests/node_tests/typeahead_helper.js +++ b/frontend_tests/node_tests/typeahead_helper.js @@ -80,7 +80,7 @@ run_test("sort_streams", () => { }, ]; - stream_data.is_active = (sub) => sub.name !== "dead"; + stream_data.__Rewire__("is_active", (sub) => sub.name !== "dead"); test_streams = th.sort_streams(test_streams, "d"); assert.deepEqual(test_streams[0].name, "Denmark"); // Pinned streams first diff --git a/frontend_tests/node_tests/ui_init.js b/frontend_tests/node_tests/ui_init.js index 80c5df800d..0f40b6d625 100644 --- a/frontend_tests/node_tests/ui_init.js +++ b/frontend_tests/node_tests/ui_init.js @@ -109,7 +109,6 @@ const util = zrequire("util"); zrequire("hash_util"); zrequire("stream_edit"); -zrequire("stream_data"); zrequire("condense"); zrequire("lightbox"); zrequire("overlays"); diff --git a/frontend_tests/node_tests/unread.js b/frontend_tests/node_tests/unread.js index f3a7c3b4dd..e0f4cce232 100644 --- a/frontend_tests/node_tests/unread.js +++ b/frontend_tests/node_tests/unread.js @@ -260,12 +260,12 @@ run_test("num_unread_for_topic", () => { const stream_id = 301; - stream_data.get_sub_by_id = (arg) => { + stream_data.__Rewire__("get_sub_by_id", (arg) => { if (arg === stream_id) { return {name: "Some Stream"}; } throw new Error(`Unknown stream ${arg}`); - }; + }); let count = unread.num_unread_for_topic(stream_id, "lunch"); assert.equal(count, 0); @@ -329,14 +329,14 @@ run_test("num_unread_for_topic", () => { }); run_test("home_messages", () => { - stream_data.is_subscribed = () => true; - stream_data.is_muted = () => false; + stream_data.__Rewire__("is_subscribed", () => true); + stream_data.__Rewire__("is_muted", () => false); const stream_id = 401; - stream_data.get_sub_by_id = () => ({ + stream_data.__Rewire__("get_sub_by_id", () => ({ name: "whatever", - }); + })); const message = { id: 15, @@ -367,7 +367,7 @@ run_test("home_messages", () => { test_notifiable_count(counts.home_unread_messages, 0); // Now unsubscribe all our streams. - stream_data.is_subscribed = () => false; + stream_data.__Rewire__("is_subscribed", () => false); counts = unread.get_counts(); assert.equal(counts.home_unread_messages, 0); test_notifiable_count(counts.home_unread_messages, 0); @@ -381,7 +381,7 @@ run_test("phantom_messages", () => { topic: "phantom", }; - stream_data.get_sub_by_id = () => {}; + stream_data.__Rewire__("get_sub_by_id", () => {}); unread.mark_as_read(message.id); const counts = unread.get_counts(); diff --git a/static/js/bundles/app.js b/static/js/bundles/app.js index 341e4099c5..93a7779756 100644 --- a/static/js/bundles/app.js +++ b/static/js/bundles/app.js @@ -25,7 +25,6 @@ import "../message_list"; import "../narrow"; import "../reload"; import "../compose_actions"; -import "../stream_data"; import "../stream_topic_history"; import "../stream_muting"; import "../stream_events"; diff --git a/static/js/compose.js b/static/js/compose.js index 00e9cd2bf6..e813a800a8 100644 --- a/static/js/compose.js +++ b/static/js/compose.js @@ -22,6 +22,7 @@ import * as rendered_markdown from "./rendered_markdown"; import * as rtl from "./rtl"; import * as sent_messages from "./sent_messages"; import * as settings_config from "./settings_config"; +import * as stream_data from "./stream_data"; import * as transmit from "./transmit"; import * as upload from "./upload"; import * as util from "./util"; diff --git a/static/js/compose_actions.js b/static/js/compose_actions.js index bacedc8ec1..23e8d4da06 100644 --- a/static/js/compose_actions.js +++ b/static/js/compose_actions.js @@ -15,6 +15,7 @@ const message_viewport = require("./message_viewport"); const narrow_state = require("./narrow_state"); const people = require("./people"); const reload_state = require("./reload_state"); +const stream_data = require("./stream_data"); exports.blur_compose_inputs = function () { $(".message_comp").find("input, textarea, button, #private_message_recipient").trigger("blur"); diff --git a/static/js/compose_fade.js b/static/js/compose_fade.js index 81278d180a..e7821ba25b 100644 --- a/static/js/compose_fade.js +++ b/static/js/compose_fade.js @@ -4,6 +4,7 @@ import * as compose_state from "./compose_state"; import * as message_viewport from "./message_viewport"; import * as people from "./people"; import * as rows from "./rows"; +import * as stream_data from "./stream_data"; import * as util from "./util"; let focused_recipient; diff --git a/static/js/composebox_typeahead.js b/static/js/composebox_typeahead.js index 2ffd734c6c..f710057261 100644 --- a/static/js/composebox_typeahead.js +++ b/static/js/composebox_typeahead.js @@ -16,6 +16,7 @@ const compose_state = require("./compose_state"); const people = require("./people"); const rows = require("./rows"); const settings_data = require("./settings_data"); +const stream_data = require("./stream_data"); const user_groups = require("./user_groups"); const user_pill = require("./user_pill"); diff --git a/static/js/drafts.js b/static/js/drafts.js index ee5d594123..a9ea68acef 100644 --- a/static/js/drafts.js +++ b/static/js/drafts.js @@ -10,6 +10,7 @@ import {localstorage} from "./localstorage"; import * as markdown from "./markdown"; import * as people from "./people"; import * as stream_color from "./stream_color"; +import * as stream_data from "./stream_data"; import * as util from "./util"; function set_count(count) { diff --git a/static/js/filter.js b/static/js/filter.js index c6399817b2..48c97f8cbc 100644 --- a/static/js/filter.js +++ b/static/js/filter.js @@ -2,6 +2,7 @@ import Handlebars from "handlebars/runtime"; import _ from "lodash"; import * as people from "./people"; +import * as stream_data from "./stream_data"; import * as util from "./util"; function zephyr_stream_name_match(message, operand) { diff --git a/static/js/global.d.ts b/static/js/global.d.ts index c5ba3b6957..4a007b29f9 100644 --- a/static/js/global.d.ts +++ b/static/js/global.d.ts @@ -85,7 +85,6 @@ declare let settings_toggle: any; declare let settings_user_groups: any; declare let settings_users: any; declare let starred_messages: any; -declare let stream_data: any; declare let stream_edit: any; declare let stream_events: any; declare let stream_list: any; diff --git a/static/js/hash_util.js b/static/js/hash_util.js index 9395643669..10d722a43a 100644 --- a/static/js/hash_util.js +++ b/static/js/hash_util.js @@ -2,6 +2,7 @@ const narrow_state = require("./narrow_state"); const people = require("./people"); +const stream_data = require("./stream_data"); exports.get_hash_category = function (hash) { // given "#streams/subscribed", returns "streams" diff --git a/static/js/invite.js b/static/js/invite.js index cc2a1cc672..ad02e3e460 100644 --- a/static/js/invite.js +++ b/static/js/invite.js @@ -8,6 +8,7 @@ import render_settings_dev_env_email_access from "../templates/settings/dev_env_ import * as channel from "./channel"; import * as common from "./common"; +import * as stream_data from "./stream_data"; function reset_error_messages() { $("#invite_status").hide().text("").removeClass(common.status_classes); diff --git a/static/js/markdown_config.js b/static/js/markdown_config.js index a1d100a1c6..221de8ba66 100644 --- a/static/js/markdown_config.js +++ b/static/js/markdown_config.js @@ -1,4 +1,5 @@ import * as people from "./people"; +import * as stream_data from "./stream_data"; import * as user_groups from "./user_groups"; /* diff --git a/static/js/message_edit.js b/static/js/message_edit.js index e534d0f52f..c123261415 100644 --- a/static/js/message_edit.js +++ b/static/js/message_edit.js @@ -12,6 +12,7 @@ const loading = require("./loading"); const markdown = require("./markdown"); const message_viewport = require("./message_viewport"); const rows = require("./rows"); +const stream_data = require("./stream_data"); const upload = require("./upload"); const currently_editing_messages = new Map(); diff --git a/static/js/message_events.js b/static/js/message_events.js index 8242ea950f..45999fdd6d 100644 --- a/static/js/message_events.js +++ b/static/js/message_events.js @@ -9,6 +9,7 @@ const message_edit_history = require("./message_edit_history"); const narrow_state = require("./narrow_state"); const pm_list = require("./pm_list"); const recent_senders = require("./recent_senders"); +const stream_data = require("./stream_data"); const unread_ui = require("./unread_ui"); const util = require("./util"); diff --git a/static/js/message_fetch.js b/static/js/message_fetch.js index 5a9ad5d781..b5f879e154 100644 --- a/static/js/message_fetch.js +++ b/static/js/message_fetch.js @@ -5,6 +5,7 @@ const {Filter} = require("./filter"); const huddle_data = require("./huddle_data"); const people = require("./people"); const pm_list = require("./pm_list"); +const stream_data = require("./stream_data"); const consts = { backfill_idle_time: 10 * 1000, diff --git a/static/js/message_list.js b/static/js/message_list.js index 428028a837..ae45800716 100644 --- a/static/js/message_list.js +++ b/static/js/message_list.js @@ -5,6 +5,7 @@ const autosize = require("autosize"); const {MessageListData} = require("./message_list_data"); const {MessageListView} = require("./message_list_view"); const narrow_state = require("./narrow_state"); +const stream_data = require("./stream_data"); exports.narrowed = undefined; exports.set_narrowed = function (value) { diff --git a/static/js/message_list_view.js b/static/js/message_list_view.js index 7fbf0e5494..2eb0201858 100644 --- a/static/js/message_list_view.js +++ b/static/js/message_list_view.js @@ -14,6 +14,7 @@ import * as people from "./people"; import * as rendered_markdown from "./rendered_markdown"; import * as rows from "./rows"; import * as stream_color from "./stream_color"; +import * as stream_data from "./stream_data"; import * as submessage from "./submessage"; import * as util from "./util"; diff --git a/static/js/muting.js b/static/js/muting.js index a01868555f..8e9a7f23fd 100644 --- a/static/js/muting.js +++ b/static/js/muting.js @@ -1,4 +1,5 @@ import {FoldDict} from "./fold_dict"; +import * as stream_data from "./stream_data"; const muted_topics = new Map(); diff --git a/static/js/muting_ui.js b/static/js/muting_ui.js index eb9242ddec..9f510b6773 100644 --- a/static/js/muting_ui.js +++ b/static/js/muting_ui.js @@ -5,6 +5,7 @@ import * as channel from "./channel"; import * as feedback_widget from "./feedback_widget"; import * as muting from "./muting"; import * as settings_muting from "./settings_muting"; +import * as stream_data from "./stream_data"; import * as unread_ui from "./unread_ui"; function timestamp_ms() { diff --git a/static/js/narrow.js b/static/js/narrow.js index 1818a0b2d0..75b95a4adf 100644 --- a/static/js/narrow.js +++ b/static/js/narrow.js @@ -9,6 +9,7 @@ const {MessageListData} = require("./message_list_data"); const narrow_state = require("./narrow_state"); const people = require("./people"); const search_pill = require("./search_pill"); +const stream_data = require("./stream_data"); const top_left_corner = require("./top_left_corner"); const topic_generator = require("./topic_generator"); const util = require("./util"); diff --git a/static/js/narrow_state.js b/static/js/narrow_state.js index ccf0e401f1..791107845e 100644 --- a/static/js/narrow_state.js +++ b/static/js/narrow_state.js @@ -1,5 +1,6 @@ import {Filter} from "./filter"; import * as people from "./people"; +import * as stream_data from "./stream_data"; let current_filter; diff --git a/static/js/notifications.js b/static/js/notifications.js index 92de10179e..8b4484ad3b 100644 --- a/static/js/notifications.js +++ b/static/js/notifications.js @@ -13,6 +13,7 @@ const narrow_state = require("./narrow_state"); const people = require("./people"); const settings_config = require("./settings_config"); const spoilers = require("./spoilers"); +const stream_data = require("./stream_data"); const stream_ui_updates = require("./stream_ui_updates"); const notice_memory = new Map(); diff --git a/static/js/peer_data.js b/static/js/peer_data.js index 0ea5f1546e..d96839f346 100644 --- a/static/js/peer_data.js +++ b/static/js/peer_data.js @@ -1,3 +1,5 @@ +import * as stream_data from "./stream_data"; + const {LazySet} = require("./lazy_set"); const people = require("./people"); diff --git a/static/js/recent_topics.js b/static/js/recent_topics.js index 77e37f2167..262b578b60 100644 --- a/static/js/recent_topics.js +++ b/static/js/recent_topics.js @@ -10,6 +10,7 @@ const muting = require("./muting"); const narrow_state = require("./narrow_state"); const people = require("./people"); const recent_senders = require("./recent_senders"); +const stream_data = require("./stream_data"); const top_left_corner = require("./top_left_corner"); const topics = new Map(); // Key is stream-id:topic. diff --git a/static/js/rendered_markdown.js b/static/js/rendered_markdown.js index 08806fe3cf..412eeb2f61 100644 --- a/static/js/rendered_markdown.js +++ b/static/js/rendered_markdown.js @@ -6,6 +6,7 @@ import view_code_in_playground from "../templates/view_code_in_playground.hbs"; import * as people from "./people"; import * as rtl from "./rtl"; import * as settings_config from "./settings_config"; +import * as stream_data from "./stream_data"; import * as user_groups from "./user_groups"; const {parseISO, isValid} = require("date-fns"); diff --git a/static/js/search_suggestion.js b/static/js/search_suggestion.js index e74c455fed..ab3aa8b935 100644 --- a/static/js/search_suggestion.js +++ b/static/js/search_suggestion.js @@ -8,6 +8,7 @@ const huddle_data = require("./huddle_data"); const narrow_state = require("./narrow_state"); const people = require("./people"); const settings_data = require("./settings_data"); +const stream_data = require("./stream_data"); exports.max_num_of_search_results = 12; diff --git a/static/js/server_events_dispatch.js b/static/js/server_events_dispatch.js index e87f06666d..6209b939e9 100644 --- a/static/js/server_events_dispatch.js +++ b/static/js/server_events_dispatch.js @@ -10,6 +10,7 @@ import * as peer_data from "./peer_data"; import * as people from "./people"; import * as reload from "./reload"; import * as settings_config from "./settings_config"; +import * as stream_data from "./stream_data"; import * as submessage from "./submessage"; import * as user_groups from "./user_groups"; import * as user_status from "./user_status"; diff --git a/static/js/settings_notifications.js b/static/js/settings_notifications.js index 7c756b861b..d060ef7b60 100644 --- a/static/js/settings_notifications.js +++ b/static/js/settings_notifications.js @@ -5,6 +5,7 @@ const render_stream_specific_notification_row = require("../templates/settings/s const channel = require("./channel"); const settings_config = require("./settings_config"); const settings_ui = require("./settings_ui"); +const stream_data = require("./stream_data"); const unread_ui = require("./unread_ui"); exports.get_notifications_table_row_data = function (notify_settings) { diff --git a/static/js/settings_org.js b/static/js/settings_org.js index c4a0042a9c..a828d9ba78 100644 --- a/static/js/settings_org.js +++ b/static/js/settings_org.js @@ -8,6 +8,7 @@ const channel = require("./channel"); const loading = require("./loading"); const settings_config = require("./settings_config"); const settings_ui = require("./settings_ui"); +const stream_data = require("./stream_data"); const meta = { loaded: false, diff --git a/static/js/settings_streams.js b/static/js/settings_streams.js index ebad975569..82e6963a05 100644 --- a/static/js/settings_streams.js +++ b/static/js/settings_streams.js @@ -4,6 +4,7 @@ const render_admin_default_streams_list = require("../templates/admin_default_st const channel = require("./channel"); const loading = require("./loading"); +const stream_data = require("./stream_data"); const meta = { loaded: false, diff --git a/static/js/stream_create.js b/static/js/stream_create.js index 67bb5dbb28..34f5040073 100644 --- a/static/js/stream_create.js +++ b/static/js/stream_create.js @@ -6,6 +6,7 @@ import * as channel from "./channel"; import * as loading from "./loading"; import * as peer_data from "./peer_data"; import * as people from "./people"; +import * as stream_data from "./stream_data"; let created_stream; diff --git a/static/js/stream_data.js b/static/js/stream_data.js index f2fd21b6b3..d1c80bacb5 100644 --- a/static/js/stream_data.js +++ b/static/js/stream_data.js @@ -1,15 +1,13 @@ -"use strict"; - -const color_data = require("./color_data"); -const {FoldDict} = require("./fold_dict"); -const peer_data = require("./peer_data"); -const people = require("./people"); -const settings_config = require("./settings_config"); -const stream_color = require("./stream_color"); -const util = require("./util"); +import * as color_data from "./color_data"; +import {FoldDict} from "./fold_dict"; +import * as peer_data from "./peer_data"; +import * as people from "./people"; +import * as settings_config from "./settings_config"; +import * as stream_color from "./stream_color"; +import * as util from "./util"; // Expose get_subscriber_count for our automated puppeteer tests. -exports.get_subscriber_count = peer_data.get_subscriber_count; +export const get_subscriber_count = peer_data.get_subscriber_count; class BinaryDict { /* @@ -98,7 +96,7 @@ let filter_out_inactives = false; const stream_ids_by_name = new FoldDict(); const default_stream_ids = new Set(); -exports.stream_privacy_policy_values = { +export const stream_privacy_policy_values = { public: { code: "public", name: i18n.t("Public"), @@ -122,7 +120,7 @@ exports.stream_privacy_policy_values = { }, }; -exports.stream_post_policy_values = { +export const stream_post_policy_values = { everyone: { code: 1, description: i18n.t("All stream members can post"), @@ -137,21 +135,21 @@ exports.stream_post_policy_values = { }, }; -exports.clear_subscriptions = function () { +export function clear_subscriptions() { // This function is only used once at page load, and then // it should only be used in tests. stream_info = new BinaryDict((sub) => sub.subscribed); subs_by_stream_id = new Map(); -}; +} -exports.clear_subscriptions(); +clear_subscriptions(); -exports.set_filter_out_inactives = function () { +export function set_filter_out_inactives() { if ( page_params.demote_inactive_streams === settings_config.demote_inactive_streams_values.automatic.code ) { - filter_out_inactives = exports.num_subscribed_subs() >= 30; + filter_out_inactives = num_subscribed_subs() >= 30; } else if ( page_params.demote_inactive_streams === settings_config.demote_inactive_streams_values.always.code @@ -160,14 +158,14 @@ exports.set_filter_out_inactives = function () { } else { filter_out_inactives = false; } -}; +} // for testing: -exports.is_filtering_inactives = function () { +export function is_filtering_inactives() { return filter_out_inactives; -}; +} -exports.is_active = function (sub) { +export function is_active(sub) { if (!filter_out_inactives || sub.pin_to_top) { // If users don't want to filter inactive streams // to the bottom, we respect that setting and don't @@ -179,9 +177,9 @@ exports.is_active = function (sub) { return true; } return stream_topic_history.stream_has_topics(sub.stream_id) || sub.newly_subscribed; -}; +} -exports.rename_sub = function (sub, new_name) { +export function rename_sub(sub, new_name) { const old_name = sub.name; stream_ids_by_name.set(old_name, sub.stream_id); @@ -189,42 +187,42 @@ exports.rename_sub = function (sub, new_name) { sub.name = new_name; stream_info.delete(old_name); stream_info.set(new_name, sub); -}; +} -exports.subscribe_myself = function (sub) { +export function subscribe_myself(sub) { const user_id = people.my_current_user_id(); peer_data.add_subscriber(sub.stream_id, user_id); sub.subscribed = true; sub.newly_subscribed = true; stream_info.set_true(sub.name, sub); -}; +} -exports.unsubscribe_myself = function (sub) { +export function unsubscribe_myself(sub) { // Remove user from subscriber's list const user_id = people.my_current_user_id(); peer_data.remove_subscriber(sub.stream_id, user_id); sub.subscribed = false; sub.newly_subscribed = false; stream_info.set_false(sub.name, sub); -}; +} -exports.add_sub = function (sub) { +export function add_sub(sub) { // This function is currently used only by tests. // We use create_sub_from_server_data at page load. // We use create_streams for new streams in live-update events. stream_info.set(sub.name, sub); subs_by_stream_id.set(sub.stream_id, sub); -}; +} -exports.get_sub = function (stream_name) { +export function get_sub(stream_name) { return stream_info.get(stream_name); -}; +} -exports.get_sub_by_id = function (stream_id) { +export function get_sub_by_id(stream_id) { return subs_by_stream_id.get(stream_id); -}; +} -exports.validate_stream_ids = function (stream_ids) { +export function validate_stream_ids(stream_ids) { const good_ids = []; const bad_ids = []; @@ -241,9 +239,9 @@ exports.validate_stream_ids = function (stream_ids) { } return good_ids; -}; +} -exports.get_stream_id = function (name) { +export function get_stream_id(name) { // Note: Only use this function for situations where // you are comfortable with a user dealing with an // old name of a stream (from prior to a rename). @@ -255,9 +253,9 @@ exports.get_stream_id = function (name) { const stream_id = stream_ids_by_name.get(name); return stream_id; -}; +} -exports.get_sub_by_name = function (name) { +export function get_sub_by_name(name) { // Note: Only use this function for situations where // you are comfortable with a user dealing with an // old name of a stream (from prior to a rename). @@ -275,20 +273,20 @@ exports.get_sub_by_name = function (name) { } return subs_by_stream_id.get(stream_id); -}; +} -exports.id_to_slug = function (stream_id) { - let name = exports.maybe_get_stream_name(stream_id) || "unknown"; +export function id_to_slug(stream_id) { + let name = maybe_get_stream_name(stream_id) || "unknown"; // The name part of the URL doesn't really matter, so we try to // make it pretty. name = name.replace(" ", "-"); return stream_id + "-" + name; -}; +} -exports.name_to_slug = function (name) { - const stream_id = exports.get_stream_id(name); +export function name_to_slug(name) { + const stream_id = get_stream_id(name); if (!stream_id) { return name; @@ -299,9 +297,9 @@ exports.name_to_slug = function (name) { name = name.replace(" ", "-"); return stream_id + "-" + name; -}; +} -exports.slug_to_name = function (slug) { +export function slug_to_name(slug) { /* Modern stream slugs look like this, where 42 is a stream id: @@ -347,9 +345,9 @@ exports.slug_to_name = function (slug) { stream id as a prefix. */ return slug; -}; +} -exports.delete_sub = function (stream_id) { +export function delete_sub(stream_id) { const sub = subs_by_stream_id.get(stream_id); if (!sub) { blueslip.warn("Failed to delete stream " + stream_id); @@ -357,20 +355,20 @@ exports.delete_sub = function (stream_id) { } subs_by_stream_id.delete(stream_id); stream_info.delete(sub.name); -}; +} -exports.get_non_default_stream_names = function () { +export function get_non_default_stream_names() { let subs = Array.from(stream_info.values()); - subs = subs.filter((sub) => !exports.is_default_stream_id(sub.stream_id) && !sub.invite_only); + subs = subs.filter((sub) => !is_default_stream_id(sub.stream_id) && !sub.invite_only); const names = subs.map((sub) => sub.name); return names; -}; +} -exports.get_unsorted_subs = function () { +export function get_unsorted_subs() { return Array.from(stream_info.values()); -}; +} -exports.get_sub_for_settings = (sub) => { +export function get_sub_for_settings(sub) { // Since we make a copy of the sub here, it may eventually // make sense to get the other calculated fields here as // well, instead of using update_calculated_fields everywhere. @@ -379,17 +377,17 @@ exports.get_sub_for_settings = (sub) => { ...sub, subscriber_count: sub_count, }; -}; +} function get_subs_for_settings(subs) { // We may eventually add subscribers to the subs here, rather than // delegating, so that we can more efficiently compute subscriber counts // (in bulk). If that plan appears to have been aborted, feel free to // inline this. - return subs.map((sub) => exports.get_sub_for_settings(sub)); + return subs.map((sub) => get_sub_for_settings(sub)); } -exports.get_updated_unsorted_subs = function () { +export function get_updated_unsorted_subs() { // This function is expensive in terms of calculating // some values (particularly stream counts) but avoids // prematurely sorting subs. @@ -397,7 +395,7 @@ exports.get_updated_unsorted_subs = function () { // Add in admin options and stream counts. for (const sub of all_subs) { - exports.update_calculated_fields(sub); + update_calculated_fields(sub); } // We don't display unsubscribed streams to guest users. @@ -406,29 +404,29 @@ exports.get_updated_unsorted_subs = function () { } return get_subs_for_settings(all_subs); -}; +} -exports.num_subscribed_subs = function () { +export function num_subscribed_subs() { return stream_info.num_true_items(); -}; +} -exports.subscribed_subs = function () { +export function subscribed_subs() { return Array.from(stream_info.true_values()); -}; +} -exports.unsubscribed_subs = function () { +export function unsubscribed_subs() { return Array.from(stream_info.false_values()); -}; +} -exports.subscribed_streams = function () { - return exports.subscribed_subs().map((sub) => sub.name); -}; +export function subscribed_streams() { + return subscribed_subs().map((sub) => sub.name); +} -exports.subscribed_stream_ids = function () { - return exports.subscribed_subs().map((sub) => sub.stream_id); -}; +export function subscribed_stream_ids() { + return subscribed_subs().map((sub) => sub.stream_id); +} -exports.get_invite_stream_data = function () { +export function get_invite_stream_data() { function get_data(sub) { return { name: sub.name, @@ -447,38 +445,38 @@ exports.get_invite_stream_data = function () { } // ...plus all your subscribed streams (avoiding repeats). - for (const sub of exports.subscribed_subs()) { + for (const sub of subscribed_subs()) { if (!default_stream_ids.has(sub.stream_id)) { streams.push(get_data(sub)); } } return streams; -}; +} -exports.get_colors = function () { - return exports.subscribed_subs().map((sub) => sub.color); -}; +export function get_colors() { + return subscribed_subs().map((sub) => sub.color); +} -exports.update_stream_email_address = function (sub, email) { +export function update_stream_email_address(sub, email) { sub.email_address = email; -}; +} -exports.update_stream_post_policy = function (sub, stream_post_policy) { +export function update_stream_post_policy(sub, stream_post_policy) { sub.stream_post_policy = stream_post_policy; -}; +} -exports.update_stream_privacy = function (sub, values) { +export function update_stream_privacy(sub, values) { sub.invite_only = values.invite_only; sub.history_public_to_subscribers = values.history_public_to_subscribers; -}; +} -exports.update_message_retention_setting = function (sub, message_retention_days) { +export function update_message_retention_setting(sub, message_retention_days) { sub.message_retention_days = message_retention_days; -}; +} -exports.receives_notifications = function (stream_id, notification_name) { - const sub = exports.get_sub_by_id(stream_id); +export function receives_notifications(stream_id, notification_name) { + const sub = get_sub_by_id(stream_id); if (sub === undefined) { return false; } @@ -489,9 +487,9 @@ exports.receives_notifications = function (stream_id, notification_name) { return page_params[notification_name]; } return page_params["enable_stream_" + notification_name]; -}; +} -exports.update_calculated_fields = function (sub) { +export function update_calculated_fields(sub) { // Note that we don't calculate subscriber counts here. sub.is_realm_admin = page_params.is_admin; @@ -520,84 +518,84 @@ exports.update_calculated_fields = function (sub) { // Apply the defaults for our notification settings for rendering. for (const setting of settings_config.stream_specific_notification_settings) { - sub[setting + "_display"] = exports.receives_notifications(sub.stream_id, setting); + sub[setting + "_display"] = receives_notifications(sub.stream_id, setting); } -}; +} -exports.all_subscribed_streams_are_in_home_view = function () { - return exports.subscribed_subs().every((sub) => !sub.is_muted); -}; +export function all_subscribed_streams_are_in_home_view() { + return subscribed_subs().every((sub) => !sub.is_muted); +} -exports.home_view_stream_names = function () { - const home_view_subs = exports.subscribed_subs().filter((sub) => !sub.is_muted); +export function home_view_stream_names() { + const home_view_subs = subscribed_subs().filter((sub) => !sub.is_muted); return home_view_subs.map((sub) => sub.name); -}; +} -exports.canonicalized_name = function (stream_name) { +export function canonicalized_name(stream_name) { return stream_name.toString().toLowerCase(); -}; +} -exports.get_color = function (stream_name) { - const sub = exports.get_sub(stream_name); +export function get_color(stream_name) { + const sub = get_sub(stream_name); if (sub === undefined) { return stream_color.default_color; } return sub.color; -}; +} -exports.is_muted = function (stream_id) { - const sub = exports.get_sub_by_id(stream_id); +export function is_muted(stream_id) { + const sub = get_sub_by_id(stream_id); // Return true for undefined streams if (sub === undefined) { return true; } return sub.is_muted; -}; +} -exports.is_stream_muted_by_name = function (stream_name) { - const sub = exports.get_sub(stream_name); +export function is_stream_muted_by_name(stream_name) { + const sub = get_sub(stream_name); // Return true for undefined streams if (sub === undefined) { return true; } return sub.is_muted; -}; +} -exports.is_notifications_stream_muted = function () { - return exports.is_muted(page_params.realm_notifications_stream_id); -}; +export function is_notifications_stream_muted() { + return is_muted(page_params.realm_notifications_stream_id); +} -exports.is_subscribed = function (stream_name) { - const sub = exports.get_sub(stream_name); +export function is_subscribed(stream_name) { + const sub = get_sub(stream_name); return sub !== undefined && sub.subscribed; -}; +} -exports.id_is_subscribed = function (stream_id) { +export function id_is_subscribed(stream_id) { const sub = subs_by_stream_id.get(stream_id); return sub !== undefined && sub.subscribed; -}; +} -exports.get_stream_privacy_policy = function (stream_id) { - const sub = exports.get_sub_by_id(stream_id); +export function get_stream_privacy_policy(stream_id) { + const sub = get_sub_by_id(stream_id); if (!sub.invite_only) { - return exports.stream_privacy_policy_values.public.code; + return stream_privacy_policy_values.public.code; } if (sub.invite_only && !sub.history_public_to_subscribers) { - return exports.stream_privacy_policy_values.private.code; + return stream_privacy_policy_values.private.code; } - return exports.stream_privacy_policy_values.private_with_public_history.code; -}; + return stream_privacy_policy_values.private_with_public_history.code; +} -exports.get_invite_only = function (stream_name) { - const sub = exports.get_sub(stream_name); +export function get_invite_only(stream_name) { + const sub = get_sub(stream_name); if (sub === undefined) { return false; } return sub.invite_only; -}; +} -exports.all_topics_in_cache = function (sub) { +export function all_topics_in_cache(sub) { // Checks whether this browser's cache of contiguous messages // (used to locally render narrows) in message_list.all has all // messages from a given stream, and thus all historical topics @@ -628,25 +626,25 @@ exports.all_topics_in_cache = function (sub) { // cache. const first_cached_message = message_list.all.first(); return first_cached_message.id <= sub.first_message_id; -}; +} -exports.set_realm_default_streams = function (realm_default_streams) { +export function set_realm_default_streams(realm_default_streams) { default_stream_ids.clear(); for (const stream of realm_default_streams) { default_stream_ids.add(stream.stream_id); } -}; +} -exports.get_default_stream_ids = function () { +export function get_default_stream_ids() { return Array.from(default_stream_ids); -}; +} -exports.is_default_stream_id = function (stream_id) { +export function is_default_stream_id(stream_id) { return default_stream_ids.has(stream_id); -}; +} -exports.get_name = function (stream_name) { +export function get_name(stream_name) { // This returns the actual name of a stream if we are subscribed to // it (i.e "Denmark" vs. "denmark"), while falling thru to // stream_name if we don't have a subscription. (Stream names @@ -655,28 +653,28 @@ exports.get_name = function (stream_name) { // // This function will also do the right thing if we have // an old stream name in memory for a recently renamed stream. - const sub = exports.get_sub_by_name(stream_name); + const sub = get_sub_by_name(stream_name); if (sub === undefined) { return stream_name; } return sub.name; -}; +} -exports.maybe_get_stream_name = function (stream_id) { +export function maybe_get_stream_name(stream_id) { if (!stream_id) { return undefined; } - const stream = exports.get_sub_by_id(stream_id); + const stream = get_sub_by_id(stream_id); if (!stream) { return undefined; } return stream.name; -}; +} -exports.is_user_subscribed = function (stream_id, user_id) { - const sub = exports.get_sub_by_id(stream_id); +export function is_user_subscribed(stream_id, user_id) { + const sub = get_sub_by_id(stream_id); if (typeof sub === "undefined" || !sub.can_access_subscribers) { // If we don't know about the stream, or we ourselves cannot access subscriber list, // so we return undefined (treated as falsy if not explicitly handled). @@ -691,9 +689,9 @@ exports.is_user_subscribed = function (stream_id, user_id) { } return peer_data.is_user_subscribed(stream_id, user_id); -}; +} -exports.create_streams = function (streams) { +export function create_streams(streams) { for (const stream of streams) { // We handle subscriber stuff in other events. @@ -702,17 +700,17 @@ exports.create_streams = function (streams) { subscribed: false, ...stream, }; - exports.create_sub_from_server_data(attrs); + create_sub_from_server_data(attrs); } -}; +} -exports.create_sub_from_server_data = function (attrs) { +export function create_sub_from_server_data(attrs) { if (!attrs.stream_id) { // fail fast throw new Error("We cannot create a sub without a stream_id"); } - let sub = exports.get_sub_by_id(attrs.stream_id); + let sub = get_sub_by_id(attrs.stream_id); if (sub !== undefined) { // We've already created this subscription, no need to continue. return sub; @@ -753,16 +751,16 @@ exports.create_sub_from_server_data = function (attrs) { sub.color = color_data.pick_color(); } - exports.update_calculated_fields(sub); + update_calculated_fields(sub); stream_info.set(sub.name, sub); subs_by_stream_id.set(sub.stream_id, sub); return sub; -}; +} -exports.get_unmatched_streams_for_notification_settings = function () { - const subscribed_rows = exports.subscribed_subs(); +export function get_unmatched_streams_for_notification_settings() { + const subscribed_rows = subscribed_subs(); subscribed_rows.sort((a, b) => util.strcmp(a.name, b.name)); const notification_settings = []; @@ -773,7 +771,7 @@ exports.get_unmatched_streams_for_notification_settings = function () { const prepend = notification_name === "wildcard_mentions_notify" ? "" : "enable_stream_"; const default_setting = page_params[prepend + notification_name]; - const stream_setting = exports.receives_notifications(row.stream_id, notification_name); + const stream_setting = receives_notifications(row.stream_id, notification_name); settings_values[notification_name] = stream_setting; if (stream_setting !== default_setting) { @@ -792,17 +790,17 @@ exports.get_unmatched_streams_for_notification_settings = function () { } } return notification_settings; -}; +} -exports.get_streams_for_settings_page = function () { +export function get_streams_for_settings_page() { // TODO: This function is only used for copy-from-stream, so // the current name is slightly misleading now, plus // it's not entirely clear we need unsubscribed streams // for that. Also we may be revisiting that UI. // Build up our list of subscribed streams from the data we already have. - const subscribed_rows = exports.subscribed_subs(); - const unsubscribed_rows = exports.unsubscribed_subs(); + const subscribed_rows = subscribed_subs(); + const unsubscribed_rows = unsubscribed_subs(); // Sort and combine all our streams. function by_name(a, b) { @@ -814,18 +812,18 @@ exports.get_streams_for_settings_page = function () { // Add in admin options and stream counts. for (const sub of all_subs) { - exports.update_calculated_fields(sub); + update_calculated_fields(sub); } return get_subs_for_settings(all_subs); -}; +} -exports.sort_for_stream_settings = function (stream_ids, order) { +export function sort_for_stream_settings(stream_ids, order) { // TODO: We may want to simply use util.strcmp here, // which uses Intl.Collator() when possible. function name(stream_id) { - const sub = exports.get_sub_by_id(stream_id); + const sub = get_sub_by_id(stream_id); if (!sub) { return ""; } @@ -833,7 +831,7 @@ exports.sort_for_stream_settings = function (stream_ids, order) { } function weekly_traffic(stream_id) { - const sub = exports.get_sub_by_id(stream_id); + const sub = get_sub_by_id(stream_id); if (sub && sub.is_old_stream) { return sub.stream_weekly_traffic; } @@ -874,9 +872,9 @@ exports.sort_for_stream_settings = function (stream_ids, order) { } stream_ids.sort(orders.get(order)); -}; +} -exports.get_streams_for_admin = function () { +export function get_streams_for_admin() { // Sort and combine all our streams. function by_name(a, b) { return util.strcmp(a.name, b.name); @@ -887,7 +885,7 @@ exports.get_streams_for_admin = function () { subs.sort(by_name); return subs; -}; +} /* This module provides a common helper for finding the notification @@ -895,12 +893,14 @@ exports.get_streams_for_admin = function () { is the authoritative source of this data, and it will be updated by server_events_dispatch in case of changes. */ -exports.realm_has_notifications_stream = () => page_params.realm_notifications_stream_id !== -1; +export function realm_has_notifications_stream() { + return page_params.realm_notifications_stream_id !== -1; +} -exports.get_notifications_stream = function () { +export function get_notifications_stream() { const stream_id = page_params.realm_notifications_stream_id; if (stream_id !== -1) { - const stream_obj = exports.get_sub_by_id(stream_id); + const stream_obj = get_sub_by_id(stream_id); if (stream_obj) { return stream_obj.name; } @@ -908,9 +908,9 @@ exports.get_notifications_stream = function () { // stream the current user is not subscribed to. } return ""; -}; +} -exports.initialize = function (params) { +export function initialize(params) { /* We get `params` data, which is data that we "own" and which has already been removed from `page_params`. @@ -938,21 +938,19 @@ exports.initialize = function (params) { sub.subscribed = subscribed; sub.previously_subscribed = previously_subscribed; - exports.create_sub_from_server_data(sub); + create_sub_from_server_data(sub); } } - exports.set_realm_default_streams(realm_default_streams); + set_realm_default_streams(realm_default_streams); populate_subscriptions(subscriptions, true, true); populate_subscriptions(unsubscribed, false, true); populate_subscriptions(never_subscribed, false, false); - exports.set_filter_out_inactives(); -}; + set_filter_out_inactives(); +} -exports.remove_default_stream = function (stream_id) { +export function remove_default_stream(stream_id) { default_stream_ids.delete(stream_id); -}; - -window.stream_data = exports; +} diff --git a/static/js/stream_edit.js b/static/js/stream_edit.js index d887a6cc93..26b661ebb5 100644 --- a/static/js/stream_edit.js +++ b/static/js/stream_edit.js @@ -15,6 +15,7 @@ const settings_config = require("./settings_config"); const settings_data = require("./settings_data"); const settings_ui = require("./settings_ui"); const stream_color = require("./stream_color"); +const stream_data = require("./stream_data"); const stream_pill = require("./stream_pill"); const stream_ui_updates = require("./stream_ui_updates"); const user_pill = require("./user_pill"); diff --git a/static/js/stream_events.js b/static/js/stream_events.js index 91aac67b3f..55801f44bf 100644 --- a/static/js/stream_events.js +++ b/static/js/stream_events.js @@ -4,6 +4,7 @@ const color_data = require("./color_data"); const narrow_state = require("./narrow_state"); const peer_data = require("./peer_data"); const stream_color = require("./stream_color"); +const stream_data = require("./stream_data"); // In theory, this function should apply the account-level defaults, // however, they are only called after a manual override, so diff --git a/static/js/stream_list.js b/static/js/stream_list.js index 78ed07848a..432f304c3a 100644 --- a/static/js/stream_list.js +++ b/static/js/stream_list.js @@ -10,6 +10,7 @@ const {ListCursor} = require("./list_cursor"); const narrow_state = require("./narrow_state"); const scroll_util = require("./scroll_util"); const stream_color = require("./stream_color"); +const stream_data = require("./stream_data"); const stream_sort = require("./stream_sort"); const topic_list = require("./topic_list"); const topic_zoom = require("./topic_zoom"); diff --git a/static/js/stream_pill.js b/static/js/stream_pill.js index c1416ed4f8..2a07fdaa7e 100644 --- a/static/js/stream_pill.js +++ b/static/js/stream_pill.js @@ -1,4 +1,5 @@ import * as peer_data from "./peer_data"; +import * as stream_data from "./stream_data"; function display_pill(sub) { const sub_count = peer_data.get_subscriber_count(sub.stream_id); diff --git a/static/js/stream_popover.js b/static/js/stream_popover.js index 9858dbb600..00683572f7 100644 --- a/static/js/stream_popover.js +++ b/static/js/stream_popover.js @@ -12,6 +12,7 @@ const channel = require("./channel"); const muting = require("./muting"); const muting_ui = require("./muting_ui"); const stream_color = require("./stream_color"); +const stream_data = require("./stream_data"); // We handle stream popovers and topic popovers in this // module. Both are popped up from the left sidebar. diff --git a/static/js/stream_sort.js b/static/js/stream_sort.js index 4ffe912f42..15d4e1383a 100644 --- a/static/js/stream_sort.js +++ b/static/js/stream_sort.js @@ -1,3 +1,4 @@ +import * as stream_data from "./stream_data"; import * as util from "./util"; let previous_pinned; diff --git a/static/js/stream_topic_history.js b/static/js/stream_topic_history.js index 11199d18c6..d476bdde1d 100644 --- a/static/js/stream_topic_history.js +++ b/static/js/stream_topic_history.js @@ -2,6 +2,7 @@ const channel = require("./channel"); const {FoldDict} = require("./fold_dict"); +const stream_data = require("./stream_data"); const stream_dict = new Map(); // stream_id -> PerStreamHistory object const fetched_stream_ids = new Set(); diff --git a/static/js/stream_ui_updates.js b/static/js/stream_ui_updates.js index d6212857b0..1e828036cb 100644 --- a/static/js/stream_ui_updates.js +++ b/static/js/stream_ui_updates.js @@ -1,6 +1,7 @@ import render_subscription_type from "../templates/subscription_type.hbs"; import * as peer_data from "./peer_data"; +import * as stream_data from "./stream_data"; export function initialize_disable_btn_hint_popover( btn_wrapper, diff --git a/static/js/subs.js b/static/js/subs.js index 9a90a1f2a7..07f4a1492e 100644 --- a/static/js/subs.js +++ b/static/js/subs.js @@ -16,6 +16,7 @@ const people = require("./people"); const scroll_util = require("./scroll_util"); const search_util = require("./search_util"); const stream_create = require("./stream_create"); +const stream_data = require("./stream_data"); const stream_ui_updates = require("./stream_ui_updates"); const util = require("./util"); diff --git a/static/js/topic_generator.js b/static/js/topic_generator.js index 6ad7b6727b..95fec255f0 100644 --- a/static/js/topic_generator.js +++ b/static/js/topic_generator.js @@ -1,5 +1,6 @@ import * as muting from "./muting"; import * as pm_conversations from "./pm_conversations"; +import * as stream_data from "./stream_data"; import * as stream_sort from "./stream_sort"; export function next_topic(streams, get_topics, has_unread_messages, curr_stream, curr_topic) { diff --git a/static/js/topic_list.js b/static/js/topic_list.js index f7bb64837e..9587f13fd5 100644 --- a/static/js/topic_list.js +++ b/static/js/topic_list.js @@ -4,6 +4,7 @@ import render_more_topics from "../templates/more_topics.hbs"; import render_more_topics_spinner from "../templates/more_topics_spinner.hbs"; import render_topic_list_item from "../templates/topic_list_item.hbs"; +import * as stream_data from "./stream_data"; import * as topic_list_data from "./topic_list_data"; import * as vdom from "./vdom"; diff --git a/static/js/typeahead_helper.js b/static/js/typeahead_helper.js index c87691a337..77b6bc44e6 100644 --- a/static/js/typeahead_helper.js +++ b/static/js/typeahead_helper.js @@ -12,6 +12,7 @@ const people = require("./people"); const pm_conversations = require("./pm_conversations"); const recent_senders = require("./recent_senders"); const settings_data = require("./settings_data"); +const stream_data = require("./stream_data"); const user_groups = require("./user_groups"); const util = require("./util"); diff --git a/static/js/ui_init.js b/static/js/ui_init.js index 96822cd8db..7108134901 100644 --- a/static/js/ui_init.js +++ b/static/js/ui_init.js @@ -28,6 +28,7 @@ const rows = require("./rows"); const sent_messages = require("./sent_messages"); const spoilers = require("./spoilers"); const stream_color = require("./stream_color"); +const stream_data = require("./stream_data"); const topic_list = require("./topic_list"); const topic_zoom = require("./topic_zoom"); const tutorial = require("./tutorial"); diff --git a/static/js/ui_util.js b/static/js/ui_util.js index 82226520bc..897a8d7862 100644 --- a/static/js/ui_util.js +++ b/static/js/ui_util.js @@ -1,6 +1,7 @@ "use strict"; const stream_color = require("./stream_color"); +const stream_data = require("./stream_data"); // Add functions to this that have no non-trivial // dependencies other than jQuery. diff --git a/static/js/unread.js b/static/js/unread.js index eaeed543bd..368f1789a7 100644 --- a/static/js/unread.js +++ b/static/js/unread.js @@ -3,6 +3,7 @@ const {FoldDict} = require("./fold_dict"); const muting = require("./muting"); const people = require("./people"); +const stream_data = require("./stream_data"); const util = require("./util"); // The unread module tracks the message IDs and locations of the