Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						050915c46c 
					 
					
						
						
							
							js: Convert _.size(a) to a.length.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						612b237cec 
					 
					
						
						
							
							js: Convert remaining _.each(a, …) to a.forEach(…).  
						
						 
						
						... 
						
						
						
						The _.each calls with an inline function expression have already been
converted to for…of loops.  We could do that here, but using .forEach
when we’re just reusing an existing function seems like a good
guideline.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								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 
							
						 
					 
					
						
						
							
						
						4948240619 
					 
					
						
						
							
							js: Convert _.filter(a, …) to a.filter(…).  
						
						 
						
						... 
						
						
						
						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 
							
						 
					 
					
						
						
							
						
						ac7b09d57e 
					 
					
						
						
							
							js: Convert _.map(a, …) to a.map(…).  
						
						 
						
						... 
						
						
						
						And convert the corresponding function expressions to arrow style
while we’re here.
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 K from "ast-types/gen/kinds";
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);
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;
  recast.visit(ast, {
    visitCallExpression(path) {
      const { callee, arguments: args } = path.node;
      if (
        n.MemberExpression.check(callee) &&
        !callee.computed &&
        n.Identifier.check(callee.object) &&
        callee.object.name === "_" &&
        n.Identifier.check(callee.property) &&
        callee.property.name === "map" &&
        args.length === 2 &&
        checkExpression(args[0]) &&
        checkExpression(args[1])
      ) {
        const [arr, fn] = args;
        path.replace(
          b.callExpression(b.memberExpression(arr, b.identifier("map")), [
            n.FunctionExpression.check(fn) ||
            n.ArrowFunctionExpression.check(fn)
              ? b.arrowFunctionExpression(
                  fn.params,
                  n.BlockStatement.check(fn.body) &&
                    fn.body.body.length === 1 &&
                    n.ReturnStatement.check(fn.body.body[0])
                    ? fn.body.body[0].argument || b.identifier("undefined")
                    : fn.body
                )
              : fn,
          ])
        );
        changed = true;
      }
      this.traverse(path);
    },
  });
  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-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						719546641f 
					 
					
						
						
							
							js: Convert a.indexOf(…) !== -1 to a.includes(…).  
						
						 
						
						... 
						
						
						
						Babel polyfills this for us for Internet Explorer.
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 K from "ast-types/gen/kinds";
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);
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;
  recast.visit(ast, {
    visitBinaryExpression(path) {
      const { operator, left, right } = path.node;
      if (
        n.CallExpression.check(left) &&
        n.MemberExpression.check(left.callee) &&
        !left.callee.computed &&
        n.Identifier.check(left.callee.property) &&
        left.callee.property.name === "indexOf" &&
        left.arguments.length === 1 &&
        checkExpression(left.arguments[0]) &&
        ((["===", "!==", "==", "!=", ">", "<="].includes(operator) &&
          n.UnaryExpression.check(right) &&
          right.operator == "-" &&
          n.Literal.check(right.argument) &&
          right.argument.value === 1) ||
          ([">=", "<"].includes(operator) &&
            n.Literal.check(right) &&
            right.value === 0))
      ) {
        const test = b.callExpression(
          b.memberExpression(left.callee.object, b.identifier("includes")),
          [left.arguments[0]]
        );
        path.replace(
          ["!==", "!=", ">", ">="].includes(operator)
            ? test
            : b.unaryExpression("!", test)
        );
        changed = true;
      }
      this.traverse(path);
    },
  });
  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-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						8dee0ab1e0 
					 
					
						
						
							
							tests: Fix predicate mock in simulate_narrow.  
						
						 
						
						... 
						
						
						
						predicate is expected to return a function, not a boolean.  The
boolean true was causing _.filter to match items with a property named
"true", which is definitely not what was intended.  Matching no items
is probably also not intended, but matching every item causes the test
to fail.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						11b5d80800 
					 
					
						
						
							
							tests: Fix more undefined mocks.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <andersk@mit.edu > 
						
						
					 
					
						2020-02-10 14:08:12 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Chris Heald 
							
						 
					 
					
						
						
							
						
						fb09bd5df6 
					 
					
						
						
							
							node: Fix lightbox tests to use message_store.get().  
						
						 
						
						... 
						
						
						
						While there are still a number of problems with these tests, they now
more effectively exercise the real code. 
						
						
					 
					
						2020-02-10 14:00:10 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						fa1059aa2e 
					 
					
						
						
							
							stream_data: Remove stream_name param from add_sub().  
						
						 
						
						... 
						
						
						
						We just get the stream_name from the sub struct now.
This mostly affects node tests.
The only place in real code where we called add_sub()
was when we initialized data from the server. 
						
						
					 
					
						2020-02-09 22:08:50 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Vishnu KS 
							
						 
					 
					
						
						
							
						
						4572be8c27 
					 
					
						
						
							
							api: Rename subject_links to topic_links.  
						
						 
						
						... 
						
						
						
						Fixes  #13588  
						
						
					 
					
						2020-02-07 14:35:22 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						e9c6653852 
					 
					
						
						
							
							node tests: Always enforce blueslip warn/error/fatal.  
						
						 
						
						... 
						
						
						
						We now require all of our unit tests to handle
blueslip errors for warn/error/fatal.  This
simplifies the zblueslip code to not have any
options passed in.
Most of the places changed here fell into two
categories:
    - We were just missing a random piece of
      setup data in a happy path test.
    - We were testing error handling in just
      a lazy way to ensure 100% coverage.  Often
      these error codepaths were fairly
      contrived.
The one place where we especially lazy was
the stream_data tests, and those are now
more thorough. 
						
						
					 
					
						2020-02-07 14:15:44 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						996d054fe9 
					 
					
						
						
							
							messages: Send stream_id for stream messages.  
						
						 
						
						... 
						
						
						
						This saves a tiny bit of bandwidth, but more
importantly, it protects us against races for
stream name changes.  There's some argument that
if the user is thinking they're sending to
old_stream_name, and unbeknownst to them, the
stream has changed to new_stream_name, then we
should fail.  But I think 99% of the time the
user just wants the message to go that stream
despite any renames.
In order to verify the blueslip error, we
had to turn on error checking, which required
a tiny fix to a place where we left out
a stream_id for add_sub. 
						
						
					 
					
						2020-02-07 14:15:44 -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 
							
						 
					 
					
						
						
							
						
						0c8d199a3d 
					 
					
						
						
							
							tests: Mock empty lists correctly in page_params.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <andersk@mit.edu > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						ece4d9344a 
					 
					
						
						
							
							tests: Add missing options argument to poll_data_holder.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						dc742a5629 
					 
					
						
						
							
							tests: Convert sub_row_data from object to array.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						dd10108c24 
					 
					
						
						
							
							user_status: Iterate over page_params.user_status with Object.entries.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						5564b39ea4 
					 
					
						
						
							
							tests: Iterate over page_param_checkbox_options with Object.keys.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						0d05decbe4 
					 
					
						
						
							
							presence: Iterate over presence info with Object.entries.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						3b4dc2d8d8 
					 
					
						
						
							
							tests: Iterate over tabs with Object.values.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						8bb515dbd9 
					 
					
						
						
							
							emoji: Iterate over emoji_codes data with Object.{entries,values}.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						5de013b11e 
					 
					
						
						
							
							emoji: Iterate over realm_emoji with Object.values.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						52a8449a0e 
					 
					
						
						
							
							widgetize: Convert widget_contents from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-06 17:24:43 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						737efd1fac 
					 
					
						
						
							
							presence: Convert presence_info from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-06 17:24:43 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						442ff64836 
					 
					
						
						
							
							notifications: Convert notice_memory from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-06 17:24:43 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						362ab8838b 
					 
					
						
						
							
							emoji: Convert active_realm_emojis from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-06 17:24:43 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						419666fc31 
					 
					
						
						
							
							emoji: Convert all_realm_emojis from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-06 17:24:43 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						ab93385106 
					 
					
						
						
							
							emoji: Convert emojis_by_name from object to Map.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-06 17:24:43 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						58859ab115 
					 
					
						
						
							
							unread: Remove topic counts.  
						
						 
						
						... 
						
						
						
						We no longer use topic counts from unread.get_counts().
The topic list widget instead calls
unread.num_unread_for_topic(). 
						
						
					 
					
						2020-02-05 13:04:16 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						f0e18b3b3e 
					 
					
						
						
							
							topic list: Use vdom techniques.  
						
						 
						
						... 
						
						
						
						We avoid complicated code to update unread counts
by just using vdom.js.
One small change here is that if click on "more
topics", we replace it with the spinner instead
of putting the spinner after it.  This saves us
a redraw under the new scheme. 
						
						
					 
					
						2020-02-05 13:04:16 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						3a533dbe8f 
					 
					
						
						
							
							vdom: Add replace_content/find parameters.  
						
						 
						
						... 
						
						
						
						This will give us a bit more flexibility for
updating DOM when we have widgets that
get appended to other containers. 
						
						
					 
					
						2020-02-05 13:04:16 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						b8f01f9cda 
					 
					
						
						
							
							people: Rename method to get_by_user_id().  
						
						 
						
						... 
						
						
						
						This name is consistent with:
    get_by_email()
    get_by_name() 
						
						
					 
					
						2020-02-05 12:04:56 -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  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						437961fba3 
					 
					
						
						
							
							presence: Eliminate unused mobile-related code.  
						
						 
						
						... 
						
						
						
						We had a plan at some point to use this to display a phone icon or
something for users who would receive push notifications if you
messaged them.  IT's not clear that feature was a good idea in any
case, but it certainly shouldn't be synced as presence data; it would
change >100x less often than the rest of presence and so should likely
be synced differently, maybe as a property on user. So it's best to
delete this prototype. 
						
						
					 
					
						2020-02-05 11:50:10 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						e88fac499f 
					 
					
						
						
							
							dependencies: Upgrade emoji-datasource from 4.0.4 to 5.0.1.  
						
						 
						
						... 
						
						
						
						The “Smileys & People” category has been split into “Smilys & Emotion”
and “People & Body”.
Also, fix generate_sha1sum_emoji to read the emoji-datasource-google
version from yarn.lock, since package.json only gives a version range.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 21:30:51 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Rohitt Vashishtha 
							
						 
					 
					
						
						
							
						
						f4b02ce31e 
					 
					
						
						
							
							compose: Add fences of unused length in quote-and-reply.  
						
						 
						
						... 
						
						
						
						When quoting a message with fenced code blocks without a language,
we used to have ambiguity in which '```' fence terminates the quote.
This commit adds explicitly non-interfering fences, which fixes the
above issue as well as makes the raw message easier to quickly read.
Fixes  #12446 . 
						
						
					 
					
						2020-02-04 18:17:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Rohitt Vashishtha 
							
						 
					 
					
						
						
							
						
						f5990ccbff 
					 
					
						
						
							
							compose: Add message info with quote-and-reply.  
						
						 
						
						... 
						
						
						
						This adds the original message's sender name along with a
link to narrow to that message when using quote-and-reply.
Fixes  #11568 . 
						
						
					 
					
						2020-02-04 18:17:47 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Ryan Rehman 
							
						 
					 
					
						
						
							
						
						174b2abcfd 
					 
					
						
						
							
							settings: Migrate to stream_post_policy structure.  
						
						 
						
						... 
						
						
						
						This commit includes a new `stream_post_policy` setting,
by replacing the `is_announcement_only` field from the Stream model,
which is done by mirroring the structure of the existing
`create_stream_policy`.
It includes the necessary schema and database migrations to migrate
the is_announcement_only boolean field to stream_post_policy,
a smallPositiveInteger field similar to many other settings.
This change is done to allow organization administrators to restrict
new members from creating and posting to a stream. However, this does
not affect admins who are new members.
With many tweaks by tabbott to documentation under /help, etc.
Fixes  #13616 . 
						
						
					 
					
						2020-02-04 17:08:08 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						a672a00677 
					 
					
						
						
							
							presence: Add user_id to presence event.  
						
						 
						
						... 
						
						
						
						In a later commit, we will eliminate email for
clients who have set slim_presence as their
preference. 
						
						
					 
					
						2020-02-04 12:30:36 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						bf9144ff69 
					 
					
						
						
							
							presence: Add slim_presence flag.  
						
						 
						
						... 
						
						
						
						This flag affects page_params and the
payload you get back from POSTs to this
url:
    users/me/presence
The flag does not yet affect the
presence events that get sent to a
client. 
						
						
					 
					
						2020-02-04 12:30:34 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Steve Howell 
							
						 
					 
					
						
						
							
						
						ef84d47d88 
					 
					
						
						
							
							presence: Add warning for missing user_id.  
						
						 
						
						... 
						
						
						
						This is defensive code for the scenario that we
have a user_id in presence but not people.  This is
unlikely to occur by the time that we actually render
the buddy list, which is the context for this code.
We have previously been reporting an error here via
the people code, but we add an additional warning.
Also, we filter the user_id from the result. 
						
						
					 
					
						2020-02-04 12:24:53 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						4480963f5a 
					 
					
						
						
							
							dict: Remove each method.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						fac2c71776 
					 
					
						
						
							
							dict: Replace items method with @@iterator method.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						9e1343ff8a 
					 
					
						
						
							
							dict, lazy_set: Return an iterator from values method.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						45d3be5449 
					 
					
						
						
							
							dict, lazy_set: Return an iterator from keys method.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						61de2e8192 
					 
					
						
						
							
							dict: Remove is_empty method.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						60fac80c8e 
					 
					
						
						
							
							dict, lazy_set: Replace num_items method with size property.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00  
					
					
						 
						
						
							
							
							 
							
							
							
							
							 
						
					 
				 
			
				
					
						
							
							
								 
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						da633e953e 
					 
					
						
						
							
							lazy_set: Convert LazySet to a real class.  
						
						 
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-04 12:22:03 -08:00