Commit Graph

3526 Commits

Author SHA1 Message Date
Abhijeet Prasad Bodas 674a5fef54 node tests: Split draft_model for add/edit/delete cases.
This splits the one big `run_test` block into
add/edit/delete parts, for better clarity.

This also removes the `with_field` calls and
uses the override style instead, which is
preferred because it makes sure the stubbed
function is actually called.
2021-02-14 09:13:24 -05:00
Abhijeet Prasad Bodas 8cc0b435e5 node tests: Remove unecessary with_field call in pm_list.
After eeee6edf41, `is_all_privates`
isn't called from the `update_private_messages`
path, and doesn't need to be stubbed.
2021-02-14 09:13:24 -05:00
Abhijeet Prasad Bodas 6c6def2dcc node tests: Prefer override over with_field.
This commit replaces `with_field` calls to
use the override style instead.
`override` is preferred since it makes sure
the stubbed function is actually called,
while `with_field` doesn't, which makes it
hard to spot dead code.
2021-02-14 09:13:24 -05:00
Steve Howell 2ad879cdda node tests: Use override in echo.js. 2021-02-13 12:48:15 -08:00
Steve Howell 9698fec008 node tests: Use override for snapshot_message.
Using override ensures that the real code actually
calls the stubs here.

The one-line map() helper avoids some ugliness
from "prettify".
2021-02-13 08:50:10 -05:00
Abhijeet Prasad Bodas c183076a91 minor: Suggest with_field instead of override for non-functions. 2021-02-13 07:28:26 -05:00
Abhijeet Prasad Bodas a24d8272e8 zjsunit: Remove with_stub helper.
This doesn't add much clarity to the tests.
Using scoped stub objects is preferred instead.
2021-02-13 06:48:59 -05:00
Abhijeet Prasad Bodas 0d770c32cc node tests: Explicitly call make_stub.
This commit replaces all `with_stub` calls and
explicitly calls `make_stub` instead.
The `with_stub` helper does not add much clarity
hence we now use scoped stub objects instead.

This de-indents some blocks where scoping isn't
required, for example when there is a single
stub object inside a `run_test` function.

With this change, we also need to explicitly
assert `num_calls`.
2021-02-13 06:48:59 -05:00
Steve Howell 183c51ba51 node tutorial: Add make_stub example. 2021-02-12 12:11:23 -05:00
Steve Howell a5a5863bde node tutorial: Use override in helpers. 2021-02-12 12:11:23 -05:00
Steve Howell 69ddf68f4d node tutorial: Inline setup.
This code didn't make sense to run inside its own
run_test wrapper.
2021-02-12 12:11:23 -05:00
Steve Howell 118a212af8 node tutorial: Add with_field example. 2021-02-12 12:11:23 -05:00
Steve Howell 7672e7dd7b node tutorial: Use override() more.
This is just a better practice.
2021-02-12 12:11:23 -05:00
Steve Howell ba7e49c20e node tutorial: Use set_global for overlays. 2021-02-12 12:11:23 -05:00
Steve Howell 70fb1c225b minor: Clarify that message_store is a deep test.
I believe the original message_store example used
to stub some things here, but the part of the tutorial
that pertains to stubbing is further down.
2021-02-12 12:11:23 -05:00
Steve Howell c0874462dc node tests: Rename general.js to tutorial.js. 2021-02-12 12:11:23 -05:00
Steve Howell 1598344fa7 zjsunit: Rename `module` argument to `obj`.
Due to recent changes, `with_overrides` is no longer
constrained to overriding module methods.  You can
override methods on any type of object.
2021-02-12 12:11:23 -05:00
Steve Howell 21cb0d1547 minor: Suggest using with_field instead of override. 2021-02-12 12:11:23 -05:00
Steve Howell 16ad65dd66 zjsunit: Restrict overrides to once-per-function.
We can relax this restriction in the future, but
basically every time it came up for me, the test
code was just disorganized, or it had an easy
workaround.
2021-02-11 11:29:21 -05:00
Steve Howell 90730a18d9 node tests: Simplify stream_events.
These are still kind of a mess.

The old code combined the worst of both worlds:

    - we had one monolithic test
    - we called the events multiple times,
      verifying a different stub each time

Now I make the tests more granular.

We could actually re-combine the tests, but
in a nicer way, so that we just set
up multiple stubs and verify that all stubs
get correctly invoked.
2021-02-11 11:29:21 -05:00
Steve Howell fcf5a66aeb node tests: Move streams tests to dispatch_subs.
There is also some code cleanup here--in dispatch_subs,
we don't stub stream_data, so it's easier to write
deeper tests that actually validate the data changes.
2021-02-11 11:29:21 -05:00
Steve Howell 90ca1ded13 node tests: Split up dispatch tests. 2021-02-11 11:29:21 -05:00
Steve Howell 6f25a372ab node tests: Reuse message_list stubs.
We now just override these functions to close
on local variables.
2021-02-11 11:29:21 -05:00
Anders Kaseorg 741c0ac8ca node_tests: Change stub/events pattern to work with non-global modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-11 07:35:28 -05:00
Anders Kaseorg 2f6c9b8d0e zjsunit: Change override API to work with non-global modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-11 07:35:28 -05:00
Steve Howell d67cc2d080 slugs: Fix regex for legacy stream slugs.
This prevents a bug where we interpret "2something"
as a modern slug instead of a legacy stream name.

The bug was probably somewhat unlikely to happen in
practice, since it only manifests if 2 is an actual
stream_id.
2021-02-10 14:37:34 -08:00
Anders Kaseorg 1ec9304eee js: Convert static/js/spoilers.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 4360a13dd6 js: Convert static/js/stream_ui_updates.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 8a6fdb662a js: Convert static/js/search_pill.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg e16687af83 js: Convert static/js/settings_ui.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 63ce32b36e js: Convert static/js/typing.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 881d6c437b js: Convert static/js/tutorial.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg f3fb01a430 js: Convert static/js/colorspace.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 4c37748712 js: Convert static/js/user_status_ui.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 583febeffd js: Convert static/js/user_status.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 229aacb819 js: Convert static/js/user_search.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 6775715b9f js: Convert static/js/server_events_dispatch.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 5655e326c9 js: Convert static/js/alert_words.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg f3af16db3f js: Convert static/js/invite.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg a935af9243 js: Convert static/js/pill_typeahead.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 118edf8982 js: Convert static/js/copy_and_paste.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 9dd03998f8 js: Convert static/js/zcommand.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 1a45d53f3a js: Convert static/js/echo.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg f66441adb2 js: Convert static/js/zform.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 4513ef8861 js: Convert static/js/todo_widget.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg a1dc8e37a2 js: Convert static/js/topic_zoom.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 2771434aad js: Convert static/js/stream_sort.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 8bbb0d9193 js: Convert static/js/search_util.js to ES6 module.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 37f362f75a js: Convert static/js/feature_flags.js to ES6 module with modzulator.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg c292342d0e node_tests: Remove irrelevant set_global calls for ES6 modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 10:27:14 -08:00
Anders Kaseorg 89aa3155a9 node_tests: Don’t read from most deprecated global variables.
We still need to write to these globals with set_global because the
code being tested reads from them, but the tests themselves should
never need to read from them.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 07:40:22 -08:00
Anders Kaseorg 34e37cea1c puppeteer_tests: Don’t read from most deprecated global variables.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 07:35:11 -08:00
Anders Kaseorg 76b6ab78d8 node_tests: Remove unnecessary zrequire calls for ES6 modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-10 07:35:11 -08:00
Abhijeet Prasad Bodas 9cb41c2976 refactor: Extract `excludes_muted_topics` logic.
This commit makes it so that MessageListData
methods always attempt to filter muted messages.
We later, in a new function
(`messages_filtered_for_topic_mutes`)
check if `excludes_muted_topics` is true or not,
and skip the filtering work if it isn't.
This new function consistently returns a new list.

This refactor will later allow us to write clean
and concise code as part of mute users.

This commit also refactors the muting tests
for MessageListData, which were earlier
spread across two `run_test` functions.
These tests should remain organized,
since similar tests will be added as part of
user mutes in future commits.
2021-02-10 07:53:05 -05:00
Abhijeet Prasad Bodas 9ae44c769c refactor: Rename MessageList.muting_enabled.
Previously, the `muting_enabled` property of
MessageListData class was used to indicate whether
some messages in the message list need to be
filtered due to topic muting, depending on the
narrow. For example, we exclude messages belonging
to muted topics from stream narrows, but not from
search narrows.

The name `muting_enabled` is a bit confusing, and hence is
changed to `excludes_muted_topics`.
It is also important that the name be specific, since
a similar new property will be added for user mutes
in future commits.
2021-02-10 07:53:05 -05:00
Steve Howell a532c643c5 node tests: Improve copy_data_attribute_value test. 2021-02-09 10:42:33 -05:00
Steve Howell c1b499ea9e node tests: Simplify poll_widget test.
This is aided by adding a "toggle" helper to zjquery.
2021-02-09 10:42:33 -05:00
Steve Howell 66eaa1698c zjquery: Alphabetize methods. 2021-02-09 10:42:33 -05:00
Steve Howell 7bc4835114 node tests: Remove unnecessary zjquery stubs.
I have a local branch with a hacked up version of
zjquery that lets you basically detect when zjquery
stubs are never actually invoked by real code.

There are some nuances to that kind of audit, so
I haven't pushed the auditing code, but these
are low hanging fruit.
2021-02-09 10:42:33 -05:00
Steve Howell 55150c8195 node tests: Further simplify Mac shortcut tests.
I now just use inline the code to create stubs
for the line items in the markdown_content
container, and I don't add methods to the
zjquery stubs.

And then I use the new "children" feature in
zjquery's `$.create(sel, opts)` to set up
$(".markdown_content"), which means I don't
have to stub `each` any more.
2021-02-09 10:42:33 -05:00
Steve Howell 131375a26e zjquery: Allow passing children to $.create().
It's actually pretty rare in our codebase to
call methods like `$(...).map` or `$(...).each`,
but we now support them better in zjquery.

You can pass a list of child elements now to
`$.create(...)`.
2021-02-09 10:42:33 -05:00
Steve Howell 31f7f26a22 zjquery: Add set_height helper. 2021-02-09 10:42:33 -05:00
Steve Howell e93a4313f3 node tests: Split up adjust_mac_shortcuts test.
We also simplify the non-mac testing.
2021-02-09 10:42:33 -05:00
Anders Kaseorg 9896782fd1 dependencies: Remove XDate.
It’s even more unmaintained than Moment and doesn’t add any
functionality we don’t already have.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-07 06:41:33 -05:00
Anders Kaseorg 42a9e473ae components: Allow passing labels as HTML (but explicitly).
Fixes the sorting button labels in stream settings, which were
regressed by commit f8fbae4d8e (because
the HTML was not marked as being HTML).

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-05 20:12:57 -08:00
Anders Kaseorg 87cbd3bf16 node_tests: Use MockDate in timerender test too.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-05 13:46:37 -08:00
aryanshridhar ba197ec97e node_tests: Fixed failing rendered_markdown tests.
Follow up of #16451, since the changes in blueslip
were still referring to Moment as a library within the markdown.
2021-02-05 12:19:08 -08:00
Abhijeet Prasad Bodas e8b4902c8a node tests: Refactor muting test in message_list.
This is a minor refactor in the muting test in
`message_list`.

The `unmuted_messages` function filters out messages only
considering topic mutes, and not stream mutes.
The test previously made it look like we were testing
stream muting, by stubbing the `is_topic_muted` on the
basis of `stream_id`.

This also replaces the stub and uses real data instead.
2021-02-05 11:17:46 -08:00
Abhijeet Prasad Bodas fd2bf0b31b refactor: Rename frontend muting stuff to include 'topic'.
This is a prep commit, which renames some variables
and functions involved in topic muting to include
the word "topic" in them.

This is done to have clarity when similar code
will be added as a part of the mute-user in
future commits.
2021-02-05 11:17:46 -08:00
aryanshridhar f92f99d92d dependencies: Replace moment.js with date-fns.
Replaced methods/functions of moment.js with date-fns library.
The motive was to replace it with a smaller frontend timezone library.

Date-fns ~ 11.51 kb
moment.js ~ 217.87 kb

Some of the format strings change because date-fns encodes them
differently from how moment did.

Fixes #16373.
2021-02-05 11:04:32 -08:00
Anders Kaseorg f8fbae4d8e components: Generate properly escaped HTML.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-05 09:26:47 -08:00
Anders Kaseorg aa650a4c88 js: Escape strings interpolated into CSS selectors with CSS.escape.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-04 11:00:06 -08:00
Steve Howell 9fc1adce60 node tests: Clean up subs test.
We start our stream_id sequence at 101, and we
clarify the somewhat strange assertions related
to the "active" class.
2021-02-04 13:55:34 -05:00
Steve Howell c407293577 node tests: Clean up hard coded stream_ids.
I use 101 for the stream_id (so less chance for
false positives) and avoid hard coding it.
2021-02-04 13:55:34 -05:00
Steve Howell 8a8bf636c6 node tests: Remove unnecessary zjquery stubs.
It's not clear to me why this code was necessary,
and I assume it was either originally written
with a bit of misunderstanding of how zjquery
works or it became unnecessary with some refactoring
of the "real" code.
2021-02-04 11:53:46 -05:00
Anders Kaseorg 3560eb90b2 node_tests: Fix #comepose-textarea typo.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-04 09:24:13 -05:00
Anders Kaseorg 08fe6e4a8f blueslip: Pass through the return value in measure_time.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-02-04 09:11:04 -05:00
Steve Howell c2e3d626e2 node tests: Move data setup to module level for peer_data.
We move some of the data setup to the top of the file.

We also remove some get_sub() calls that aren't really
necessary now that peer_data and stream_data are more
independent.
2021-02-03 15:23:17 -08:00
Steve Howell 58855e8224 refactor: Remove maybe_clear_subscribers().
The maybe_clear_subscribers() function was an artifact of
when we used to attach subscribers to the "sub" records in
stream_data.js.  I think it was basically a refactoring
shim, and due to some other recent cleanup, it was only
used in test code.

We also change how we validate stream ids.

Going forward, peer_data just looks up stream_ids with the
normal stream_data API when it's trying to warn about
rogue stream_ids coming in.  As I alluded to in an earlier
commit, some of the warning code here might be overly
defensive, but at least it's pretty self-contained.
2021-02-03 15:23:17 -08:00
Steve Howell 016038dcd1 blueslip: Add measure_time wrapper.
Now when we want to measure how long a block
of code takes to execute, we just wrap it with
`blueslip.measure_time`, instead of the awkward
idiom from my original commit of getting a callback
function.

My rationale for the original scheme was that I
wanted to minimize diffs and avoid changing
`const` to `let` in a few cases, but I believe
now that the function wrapper is nicer.

In a few cases I just removed the blueslip timing
code, since I was able to confirm on czo that
the times were pretty minimal.
2021-02-03 15:23:17 -08:00
Ganesh Pawar f70629ea6c composebox: Add typeahead for /todo. 2021-01-30 09:01:13 -08:00
Steve Howell e243af531b refactor: Extract get_user_set in peer_data.
We now use the same code in all places to
get the bucket of user_ids that correspond
to a stream, and we consistently treat
a stream as having zero subscribers, not
an undefined number of subscribers, in
the hypothetical case of us asking about
a stream that we're not tracking.

The behavior for untracked streams has
always been problematic, since if a
stream is untracked, all bets are off.

So now if we don't "track" the stream,
the subscriber count is zero.  None of
our callers distinguish between undefined
and zero.

And we just consider the stream to be subscribed
by a user when add_subscriber is called,
even if we haven't been told by stream_data
to track the stream.  (We also stop
returning true/false from add_subscriber,
since only test code was looking at it.)

We protect against the most likely source
of internal-to-the-frontend bugs by adding
the assert_number() call.

We generally have to assume that the server
is sending us sensible data at page load
time, or all bets are off.

And we have good protections in place
for unknown ids in our dispatch code
for peer_add/peer_remove events.
2021-01-29 15:21:07 -08:00
Steve Howell 5a27ed6a72 refactor: Change where we initialize scrolling code.
This is a more sensible place to initialize the
the scrolling handler, plus it breaks an annoying
indirect dependency on jQuery for the unit tests.
2021-01-29 15:21:07 -08:00
Steve Howell 6c4b1183f2 node tests: Move peer_data tests to new peer_data.js. 2021-01-29 15:21:07 -08:00
Steve Howell 2edfdb4ff8 refactor: Extract bulk functions to add/remove peers.
We also streamline some of the error handling code
by doing everything up front.  This will prevent
scenarios where a single bad stream_id/user_id causes a
bunch of the same warnings in an inner loop.
2021-01-29 15:21:07 -08:00
Steve Howell e820c43b77 node tests: Verify peer_add/peer_remove save changes. 2021-01-29 15:21:07 -08:00
Steve Howell 805a2b6670 refactor: Remove stream_data.update_subscribers_count.
This removes a bit of complexity.  If a piece of
settings code needs to render a stream with
subscribers, it just asks for it.

We no longer have the brittle, action-at-a-distance
mechanism of mutating the subscriber count on to
the stream_data version of a sub.

Stream subs are pretty small, so making copies of
them is cheap, and the blueslip timings from the
previous commit can help confirm that.

There is some discussion of putting `subscriber_count`
on the Stream model, which may eventually get us
away from tracking it in `peer_data.js`, but we will
cross that bridge when we get there.  See
https://github.com/zulip/zulip/issues/17101 for
more details.
2021-01-29 15:21:07 -08:00
Steve Howell dc9b4de05f refactor: Call peer_data.get_subscriber_count().
We are trying to move away from having the
subscriber count on the sub.

This commit handles the easy one-liners
in the JS code.
2021-01-29 15:21:07 -08:00
Steve Howell 5babe54310 typeahead: Use stream_weekly_traffic for tiebreaker.
The weekly stream traffic is a better tiebreaker
for stream typeaheads than subscriber count, as
it's more directly a measure of a stream's current
relevance.

Normally stream traffic and subscriber counts are
closely correlated, but a good example for me is
the #twitter feed on czo, which only has 80 subscribers,
but which gets more traffic than our #integrations
stream (with 16k subscribers).  I would rather
see #twitter win the tiebreaker (if it even got
to the tiebreaker).

The main motivation behind this fix, though, is
to break our dependency on peer_data, which has
some upcoming changes that will introduce some
performance tradeoffs, and I want one less place
to audit.

Also, it will be easier long term to share this
code with mobile if we don't require mobile
to pull in our peer_data dependency.  (The webapp
has different forces than mobile that dicate
our data structures.)
2021-01-29 15:21:07 -08:00
Rohitt Vashishtha 75a0fa5b91 Rename list_render -> ListWidget.
Similar to DropdownListWidget, list_render is actually a widget. The
changed case more accurately represents how its supposed to be used
as a Class.
2021-01-29 09:36:35 -08:00
Aman Agrawal 8729965548 last_seen_status_from_date: Fix incorrect last seen value.
We use day_old calculated based on day instead of hours to
render last seen values. This fixes us incorrectly quoting
anything 24 - 48 hours ago as Yesterday and
incorrectly quoting `time` that are Yesterday
but < 24 hours ago in 'x hours ago' format.
2021-01-27 09:58:22 -08:00
Aman Agrawal de4aeacbb1 left-sidebar: Only add expanded class to it if it is a popover.
We were adding `expanded` class to left-sidebar when searching
for streams even if the left-sidebar was not in the popover state.
This cased confusion with popovers.any_active returning true,
when actually it is not.
2021-01-27 09:58:22 -08:00
Aman Agrawal 961d1d0a68 community_topic_edit: Increase time limit to 3 days.
24hrs is a small time in an asynchronous conversation. Increased
time limit of topic editing for non-admins to 3 days.
2021-01-25 14:55:33 -08:00
Anders Kaseorg a873a68cc7 eslint: Fix unicorn/no-new-array.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00
Anders Kaseorg 8d44cd78ec eslint: Fix unicorn/no-this-assignment.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00
Anders Kaseorg 1e7347349c eslint: Fix unicorn/no-array-push-push.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00
Anders Kaseorg 2e501c8667 eslint: Fix unicorn/consistent-destructuring.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00
Anders Kaseorg 6cd694b8e3 eslint: Fix unicorn/no-array-callback-reference.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00
Anders Kaseorg 552f4e3d22 eslint: Fix unicorn/no-array-for-each.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00
Anders Kaseorg 1fd4762063 topic_generator: Remove overengineering.
topic_generator previously included an entire lazy generator
combinator library that was used four times.  These straightforward
equivalent loops might not be as fun but they are way simpler.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2021-01-25 14:53:19 -08:00