Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						70ff164f89 
					 
					
						
						
							
							js: Convert _.any(a, …), _.some(a, …) to a.some(…).  
						
						 
						
						... 
						
						
						
						And convert the corresponding function expressions to arrow style
while we’re here.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						2285ee922e 
					 
					
						
						
							
							js: Convert _.contains(a, …) to a.includes(…).  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						02511bff1c 
					 
					
						
						
							
							js: Automatically convert _.each to for…of.  
						
						 
						
						... 
						
						
						
						This commit was automatically generated by the following script,
followed by lint --fix and a few small manual lint-related cleanups.
import * as babelParser from "recast/parsers/babel";
import * as recast from "recast";
import * as tsParser from "recast/parsers/typescript";
import { builders as b, namedTypes as n } from "ast-types";
import { Context } from "ast-types/lib/path-visitor";
import K from "ast-types/gen/kinds";
import { NodePath } from "ast-types/lib/node-path";
import assert from "assert";
import fs from "fs";
import path from "path";
import process from "process";
const checkExpression = (node: n.Node): node is K.ExpressionKind =>
  n.Expression.check(node);
const checkStatement = (node: n.Node): node is K.StatementKind =>
  n.Statement.check(node);
for (const file of process.argv.slice(2)) {
  console.log("Parsing", file);
  const ast = recast.parse(fs.readFileSync(file, { encoding: "utf8" }), {
    parser: path.extname(file) === ".ts" ? tsParser : babelParser,
  });
  let changed = false;
  let inLoop = false;
  let replaceReturn = false;
  const visitLoop = (...args: string[]) =>
    function(this: Context, path: NodePath) {
      for (const arg of args) {
        this.visit(path.get(arg));
      }
      const old = { inLoop };
      inLoop = true;
      this.visit(path.get("body"));
      inLoop = old.inLoop;
      return false;
    };
  recast.visit(ast, {
    visitDoWhileStatement: visitLoop("test"),
    visitExpressionStatement(path) {
      const { expression, comments } = path.node;
      let valueOnly;
      if (
        n.CallExpression.check(expression) &&
        n.MemberExpression.check(expression.callee) &&
        !expression.callee.computed &&
        n.Identifier.check(expression.callee.object) &&
        expression.callee.object.name === "_" &&
        n.Identifier.check(expression.callee.property) &&
        ["each", "forEach"].includes(expression.callee.property.name) &&
        [2, 3].includes(expression.arguments.length) &&
        checkExpression(expression.arguments[0]) &&
        (n.FunctionExpression.check(expression.arguments[1]) ||
          n.ArrowFunctionExpression.check(expression.arguments[1])) &&
        [1, 2].includes(expression.arguments[1].params.length) &&
        n.Identifier.check(expression.arguments[1].params[0]) &&
        ((valueOnly = expression.arguments[1].params[1] === undefined) ||
          n.Identifier.check(expression.arguments[1].params[1])) &&
        (expression.arguments[2] === undefined ||
          n.ThisExpression.check(expression.arguments[2]))
      ) {
        const old = { inLoop, replaceReturn };
        inLoop = false;
        replaceReturn = true;
        this.visit(
          path
            .get("expression")
            .get("arguments")
            .get(1)
            .get("body")
        );
        inLoop = old.inLoop;
        replaceReturn = old.replaceReturn;
        const [right, { body, params }] = expression.arguments;
        const loop = b.forOfStatement(
          b.variableDeclaration("let", [
            b.variableDeclarator(
              valueOnly ? params[0] : b.arrayPattern([params[1], params[0]])
            ),
          ]),
          valueOnly
            ? right
            : b.callExpression(
                b.memberExpression(right, b.identifier("entries")),
                []
              ),
          checkStatement(body) ? body : b.expressionStatement(body)
        );
        loop.comments = comments;
        path.replace(loop);
        changed = true;
      }
      this.traverse(path);
    },
    visitForStatement: visitLoop("init", "test", "update"),
    visitForInStatement: visitLoop("left", "right"),
    visitForOfStatement: visitLoop("left", "right"),
    visitFunction(path) {
      this.visit(path.get("params"));
      const old = { replaceReturn };
      replaceReturn = false;
      this.visit(path.get("body"));
      replaceReturn = old.replaceReturn;
      return false;
    },
    visitReturnStatement(path) {
      if (replaceReturn) {
        assert(!inLoop); // could use labeled continue if this ever fires
        const { argument, comments } = path.node;
        if (argument === null) {
          const s = b.continueStatement();
          s.comments = comments;
          path.replace(s);
        } else {
          const s = b.expressionStatement(argument);
          s.comments = comments;
          path.replace(s, b.continueStatement());
        }
        return false;
      }
      this.traverse(path);
    },
    visitWhileStatement: visitLoop("test"),
  });
  if (changed) {
    console.log("Writing", file);
    fs.writeFileSync(file, recast.print(ast).code, { encoding: "utf8" });
  }
}
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						de3146c137 
					 
					
						
						
							
							js: Replace [...x] with Array.from(x).  
						
						 
						
						... 
						
						
						
						Babel strict generates more code for [...x] than you’d like, while
Babel loose mode assumes x is an array.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-05 11:52:52 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						252910202b 
					 
					
						
						
							
							poll_widget: Convert votes from object to Map.  
						
						 
						
						... 
						
						
						
						Fixes implicity stringification of the user ID keys.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-03 15:59:26 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						85620df34e 
					 
					
						
						
							
							poll_widget: Convert key_to_option from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-03 15:59:26 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						28f3dfa284 
					 
					
						
						
							
							js: Automatically convert var to let and const in most files.  
						
						 
						
						... 
						
						
						
						This commit was originally automatically generated using `tools/lint
--only=eslint --fix`.  It was then modified by tabbott to contain only
changes to a set of files that are unlikely to result in significant
merge conflicts with any open pull request, excluding about 20 files.
His plan is to merge the remaining changes with more precise care,
potentially involving merging parts of conflicting pull requests
before running the `eslint --fix` operation.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2019-11-03 12:42:39 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						d17b577d0c 
					 
					
						
						
							
							js: Purge useless IIFEs.  
						
						 
						
						... 
						
						
						
						With webpack, variables declared in each file are already file-local
(Global variables need to be explicitly exported), so these IIFEs are
no longer needed.
Signed-off-by: Anders Kaseorg <andersk@mit.edu > 
						
						
					 
					
						2019-10-25 13:51:21 -07:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						db0b33842c 
					 
					
						
						
							
							templates: Replace templates.render with require calls.  
						
						 
						
						... 
						
						
						
						This removes an unnecessary layer of indirection and allows webpack to
catch filename mistakes.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2019-07-12 21:11:14 -07:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						3c3471b720 
					 
					
						
						
							
							templates: Rename *.handlebars ↦ *.hbs and - ↦ _.  
						
						 
						
						... 
						
						
						
						Tweaked by tabbott to avoid accidentally disabling the linter for
handlebars templates.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2019-07-12 21:11:03 -07:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Thomas Ip 
							
						 
					 
					
						
						
							
						
						f6aaf43029 
					 
					
						
						
							
							refactor: Use explicit path when referencing handlebars templates.  
						
						 
						
						
						
						
					 
					
						2019-07-02 16:23:30 -07:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								varunvaruns9 
							
						 
					 
					
						
						
							
						
						b4f35bd54e 
					 
					
						
						
							
							poll_widget: Add highlight for vote count if current user votes.  
						
						 
						
						... 
						
						
						
						Add a background highlight to vote count button if currently
logged in user votes on that option.
Tweaked by tabbott to use better variable names and Rishi for better
styling. 
						
						
					 
					
						2019-03-01 16:35:18 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Rohitt Vashishtha 
							
						 
					 
					
						
						
							
						
						a197959959 
					 
					
						
						
							
							poll-widget: Downgrade key error to warning.  
						
						 
						
						... 
						
						
						
						It is an error, but it is obnoxious in dev to get these. 
						
						
					 
					
						2019-01-29 09:34:14 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Rohitt Vashishtha 
							
						 
					 
					
						
						
							
						
						c176891c2e 
					 
					
						
						
							
							poll-widget: Refactor comment to option.  
						
						 
						
						... 
						
						
						
						We had initially designed the poll widget like a blog
post with comments beneath it but it makes more sense
to think of it as just a simple poll with options. 
						
						
					 
					
						2019-01-29 09:34:14 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Rohitt Vashishtha 
							
						 
					 
					
						
						
							
						
						5641afc6e2 
					 
					
						
						
							
							poll-widget: Add syntax for adding options when creating poll.  
						
						 
						
						... 
						
						
						
						We add a new syntax which converts the messages like the following:
```
/poll Who do you support?
Nadal
- Djokovic
```
to a poll with the two names as options. The list syntax is optional
since anyone making a poll is likely to want to create a list anyway. 
						
						
					 
					
						2019-01-29 09:34:14 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								ss62171 
							
						 
					 
					
						
						
							
						
						63702d50e6 
					 
					
						
						
							
							poll widget: Fix duplicate options bug in poll.  
						
						 
						
						... 
						
						
						
						This is a frontend-only change to make it difficult to accidentally
create duplicate options in the poll widget menu. 
						
						
					 
					
						2019-01-26 15:48:28 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						8aee6a1dd7 
					 
					
						
						
							
							poll widget: Add some keyboard support.  
						
						 
						
						... 
						
						
						
						We support enter/ESC for our input fields.
You still need to use the mouse to vote. 
						
						
					 
					
						2019-01-22 10:27:39 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						bacf896228 
					 
					
						
						
							
							poll widget: Clean up code and add edit controls.  
						
						 
						
						... 
						
						
						
						NOTE: If you revert this commit, you want to revert
the immediately prior commit as well.  The history
is that Ishan made some improvements to the widget,
but there were some minor bugs.  I decided not
to squash the commits together so that the git
history is clear who did what.  (In particular, I
want questions about the JS code to come to me if
somebody does `git blame`.)
Anyway...
This is a fairly significant rewrite of the polling
widget, where I clean up the overall structure of
the code (including things from before the prior
fix) and try to polish the prior commit a bit as
well.
There are a few new features:
    * We tell "other" users to wait for the poll
      to start (if there's no question yet).
    * We tip the author to say "/poll foo" (as
      needed).
    * We add edit controls for the question.
    * We don't allow new choices until there's
      a question. 
						
						
					 
					
						2019-01-22 10:27:39 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								ishanrai05 
							
						 
					 
					
						
						
							
						
						85535ae09c 
					 
					
						
						
							
							poll-widget: Change "Edit question" UI to edit-pencil button.  
						
						 
						
						... 
						
						
						
						This changes the "Edit question" UI to be just an edit-pencil button
rather than a large "Edit question" button for a poll.
Fixes part of #11010 . 
						
						
					 
					
						2019-01-22 10:27:39 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Tim Abbott 
							
						 
					 
					
						
						
							
						
						7485cb2a50 
					 
					
						
						
							
							widgets: Rename voting_widget to poll_widget.  
						
						 
						
						... 
						
						
						
						This ensures greater consistency with our other widgets' naming
convention. 
						
						
					 
					
						2018-12-16 19:46:48 -08:00