From b095efaee59572800244b34564692fd999cc4ded Mon Sep 17 00:00:00 2001
From: Aya Morisawa <AyaMorisawa4869@gmail.com>
Date: Fri, 14 Apr 2017 20:45:37 +0900
Subject: [PATCH] Migrate to tslint 5.1.0

---
 src/api/endpoints/aggregation/posts/likes.ts |  2 +-
 src/api/endpoints/i/appdata/get.ts           |  6 +--
 src/api/endpoints/i/appdata/set.ts           | 12 ++---
 src/api/endpoints/posts/create.ts            | 54 ++++++++++----------
 src/api/endpoints/posts/reactions/create.ts  |  2 +-
 src/api/endpoints/posts/reactions/delete.ts  | 10 ++--
 src/api/private/signup.ts                    |  2 +-
 src/api/server.ts                            |  4 +-
 src/api/service/github.ts                    |  4 +-
 src/api/service/twitter.ts                   | 30 +++++------
 src/file/server.ts                           | 38 +++++++-------
 src/himasaku/server.ts                       |  4 +-
 src/index.ts                                 |  2 +-
 src/utils/cli/progressbar.ts                 |  6 +--
 src/web/server.ts                            | 10 ++--
 tslint.json                                  | 16 +++++-
 16 files changed, 107 insertions(+), 95 deletions(-)

diff --git a/src/api/endpoints/aggregation/posts/likes.ts b/src/api/endpoints/aggregation/posts/likes.ts
index 454368eded..5031edbffb 100644
--- a/src/api/endpoints/aggregation/posts/likes.ts
+++ b/src/api/endpoints/aggregation/posts/likes.ts
@@ -49,7 +49,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 		day = new Date(day.setSeconds(59));
 		day = new Date(day.setMinutes(59));
 		day = new Date(day.setHours(23));
-		//day = day.getTime();
+		// day = day.getTime();
 
 		const count = likes.filter(l =>
 			l.created_at < day && (l.deleted_at == null || l.deleted_at > day)
diff --git a/src/api/endpoints/i/appdata/get.ts b/src/api/endpoints/i/appdata/get.ts
index 47e1b8d202..a1a57fa13a 100644
--- a/src/api/endpoints/i/appdata/get.ts
+++ b/src/api/endpoints/i/appdata/get.ts
@@ -32,14 +32,14 @@ module.exports = (params, user, app, isSecure) => new Promise(async (res, rej) =
 	} else {
 		const select = {};
 		if (key !== null) {
-			select['data.' + key] = true;
+			select[`data.${key}`] = true;
 		}
 		const appdata = await Appdata.findOne({
 			app_id: app._id,
 			user_id: user._id
 		}, {
-			fields: select
-		});
+				fields: select
+			});
 
 		if (appdata) {
 			res(appdata.data);
diff --git a/src/api/endpoints/i/appdata/set.ts b/src/api/endpoints/i/appdata/set.ts
index eea17fd0d8..07178d6507 100644
--- a/src/api/endpoints/i/appdata/set.ts
+++ b/src/api/endpoints/i/appdata/set.ts
@@ -37,10 +37,10 @@ module.exports = (params, user, app, isSecure) => new Promise(async (res, rej) =
 	let set = {};
 	if (data) {
 		Object.entries(data).forEach(([k, v]) => {
-			set['data.' + k] = v;
+			set[`data.${k}`] = v;
 		});
 	} else {
-		set['data.' + key] = value;
+		set[`data.${key}`] = value;
 	}
 
 	if (isSecure) {
@@ -63,10 +63,10 @@ module.exports = (params, user, app, isSecure) => new Promise(async (res, rej) =
 			app_id: app._id,
 			user_id: user._id
 		}, {
-			$set: set
-		}), {
-			upsert: true
-		});
+				$set: set
+			}), {
+				upsert: true
+			});
 
 		res(204);
 	}
diff --git a/src/api/endpoints/posts/create.ts b/src/api/endpoints/posts/create.ts
index 9a86318d7d..9f313bc208 100644
--- a/src/api/endpoints/posts/create.ts
+++ b/src/api/endpoints/posts/create.ts
@@ -45,8 +45,8 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 				_id: mediaId,
 				user_id: user._id
 			}, {
-				_id: true
-			});
+					_id: true
+				});
 
 			if (entity === null) {
 				return rej('file not found');
@@ -79,23 +79,23 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 		const latestPost = await Post.findOne({
 			user_id: user._id
 		}, {
-			sort: {
-				_id: -1
-			}
-		});
+				sort: {
+					_id: -1
+				}
+			});
 
 		// 直近と同じRepost対象かつ引用じゃなかったらエラー
 		if (latestPost &&
-				latestPost.repost_id &&
-				latestPost.repost_id.equals(repost._id) &&
-				text === undefined && files === null) {
+			latestPost.repost_id &&
+			latestPost.repost_id.equals(repost._id) &&
+			text === undefined && files === null) {
 			return rej('二重Repostです(NEED TRANSLATE)');
 		}
 
 		// 直近がRepost対象かつ引用じゃなかったらエラー
 		if (latestPost &&
-				latestPost._id.equals(repost._id) &&
-				text === undefined && files === null) {
+			latestPost._id.equals(repost._id) &&
+			text === undefined && files === null) {
 			return rej('二重Repostです(NEED TRANSLATE)');
 		}
 	}
@@ -152,11 +152,11 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 			repost: user.latest_post.repost_id ? user.latest_post.repost_id.toString() : null,
 			media_ids: (user.latest_post.media_ids || []).map(id => id.toString())
 		}, {
-			text: text,
-			reply: inReplyToPost ? inReplyToPost._id.toString() : null,
-			repost: repost ? repost._id.toString() : null,
-			media_ids: (files || []).map(file => file._id.toString())
-		})) {
+				text: text,
+				reply: inReplyToPost ? inReplyToPost._id.toString() : null,
+				repost: repost ? repost._id.toString() : null,
+				media_ids: (files || []).map(file => file._id.toString())
+			})) {
 			return rej('duplicate');
 		}
 	}
@@ -179,7 +179,7 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 	// Reponse
 	res(postObj);
 
-	//--------------------------------
+	// --------------------------------
 	// Post processes
 
 	User.update({ _id: user._id }, {
@@ -288,17 +288,17 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 	if (text) {
 		// Analyze
 		const tokens = parse(text);
-/*
-		// Extract a hashtags
-		const hashtags = tokens
-			.filter(t => t.type == 'hashtag')
-			.map(t => t.hashtag)
-			// Drop dupulicates
-			.filter((v, i, s) => s.indexOf(v) == i);
+		/*
+				// Extract a hashtags
+				const hashtags = tokens
+					.filter(t => t.type == 'hashtag')
+					.map(t => t.hashtag)
+					// Drop dupulicates
+					.filter((v, i, s) => s.indexOf(v) == i);
 
-		// ハッシュタグをデータベースに登録
-		registerHashtags(user, hashtags);
-*/
+				// ハッシュタグをデータベースに登録
+				registerHashtags(user, hashtags);
+		*/
 		// Extract an '@' mentions
 		const atMentions = tokens
 			.filter(t => t.type == 'mention')
diff --git a/src/api/endpoints/posts/reactions/create.ts b/src/api/endpoints/posts/reactions/create.ts
index 5425eaea02..a3b25baa6a 100644
--- a/src/api/endpoints/posts/reactions/create.ts
+++ b/src/api/endpoints/posts/reactions/create.ts
@@ -67,7 +67,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	res();
 
 	const inc = {};
-	inc['reaction_counts.' + reaction] = 1;
+	inc[`reaction_counts.${reaction}`] = 1;
 
 	// Increment reactions count
 	await Post.update({ _id: post._id }, {
diff --git a/src/api/endpoints/posts/reactions/delete.ts b/src/api/endpoints/posts/reactions/delete.ts
index 89f6beb103..922c57ab18 100644
--- a/src/api/endpoints/posts/reactions/delete.ts
+++ b/src/api/endpoints/posts/reactions/delete.ts
@@ -42,16 +42,16 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 	await Reaction.update({
 		_id: exist._id
 	}, {
-		$set: {
-			deleted_at: new Date()
-		}
-	});
+			$set: {
+				deleted_at: new Date()
+			}
+		});
 
 	// Send response
 	res();
 
 	const dec = {};
-	dec['reaction_counts.' + exist.reaction] = -1;
+	dec[`reaction_counts.${exist.reaction}`] = -1;
 
 	// Decrement reactions count
 	Post.update({ _id: post._id }, {
diff --git a/src/api/private/signup.ts b/src/api/private/signup.ts
index bd2a7ef02a..2375c22845 100644
--- a/src/api/private/signup.ts
+++ b/src/api/private/signup.ts
@@ -58,7 +58,7 @@ export default async (req: express.Request, res: express.Response) => {
 	const hash = bcrypt.hashSync(password, salt);
 
 	// Generate secret
-	const secret = '!' + rndstr('a-zA-Z0-9', 32);
+	const secret = `!${rndstr('a-zA-Z0-9', 32)}`;
 
 	// Create account
 	const account = await User.insert({
diff --git a/src/api/server.ts b/src/api/server.ts
index 0b30222d38..0e059f5d2e 100644
--- a/src/api/server.ts
+++ b/src/api/server.ts
@@ -34,10 +34,10 @@ app.get('/', (req, res) => {
  */
 endpoints.forEach(endpoint =>
 	endpoint.withFile ?
-		app.post('/' + endpoint.name,
+		app.post(`/${endpoint.name}`,
 			endpoint.withFile ? multer({ dest: 'uploads/' }).single('file') : null,
 			require('./api-handler').default.bind(null, endpoint)) :
-		app.post('/' + endpoint.name,
+		app.post(`/${endpoint.name}`,
 			require('./api-handler').default.bind(null, endpoint))
 );
 
diff --git a/src/api/service/github.ts b/src/api/service/github.ts
index 68bc03bd5f..0d6e663419 100644
--- a/src/api/service/github.ts
+++ b/src/api/service/github.ts
@@ -22,7 +22,7 @@ module.exports = async (app: express.Application) => {
 	const handler = new EventEmitter();
 
 	app.post('/hooks/github', (req, res, next) => {
-		if ((new Buffer(req.headers['x-hub-signature'])).equals(new Buffer('sha1=' + crypto.createHmac('sha1', config.github_bot.hook_secret).update(JSON.stringify(req.body)).digest('hex')))) {
+		if ((new Buffer(req.headers['x-hub-signature'])).equals(new Buffer(`sha1=${crypto.createHmac('sha1', config.github_bot.hook_secret).update(JSON.stringify(req.body)).digest('hex')}`))) {
 			handler.emit(req.headers['x-github-event'], req.body);
 			res.sendStatus(200);
 		} else {
@@ -40,7 +40,7 @@ module.exports = async (app: express.Application) => {
 
 				// Fetch parent status
 				request({
-					url: parent.url + '/statuses',
+					url: `${parent.url}/statuses`,
 					headers: {
 						'User-Agent': 'misskey'
 					}
diff --git a/src/api/service/twitter.ts b/src/api/service/twitter.ts
index 160956cf92..9fb274aacb 100644
--- a/src/api/service/twitter.ts
+++ b/src/api/service/twitter.ts
@@ -1,6 +1,6 @@
 import * as express from 'express';
-//import * as Twitter from 'twitter';
-//const Twitter = require('twitter');
+// import * as Twitter from 'twitter';
+// const Twitter = require('twitter');
 import autwh from 'autwh';
 import redis from '../../db/redis';
 import User from '../models/user';
@@ -14,10 +14,10 @@ module.exports = (app: express.Application) => {
 		const user = await User.findOneAndUpdate({
 			token: res.locals.user
 		}, {
-			$set: {
-				twitter: null
-			}
-		});
+				$set: {
+					twitter: null
+				}
+			});
 
 		res.send(`Twitterの連携を解除しました :v:`);
 
@@ -38,7 +38,7 @@ module.exports = (app: express.Application) => {
 	const twAuth = autwh({
 		consumerKey: config.twitter.consumer_key,
 		consumerSecret: config.twitter.consumer_secret,
-		callbackUrl: config.api_url + '/tw/cb'
+		callbackUrl: `${config.api_url}/tw/cb`
 	});
 
 	app.get('/connect/twitter', async (req, res): Promise<any> => {
@@ -56,15 +56,15 @@ module.exports = (app: express.Application) => {
 			const user = await User.findOneAndUpdate({
 				token: res.locals.user
 			}, {
-				$set: {
-					twitter: {
-						access_token: result.accessToken,
-						access_token_secret: result.accessTokenSecret,
-						user_id: result.userId,
-						screen_name: result.screenName
+					$set: {
+						twitter: {
+							access_token: result.accessToken,
+							access_token_secret: result.accessTokenSecret,
+							user_id: result.userId,
+							screen_name: result.screenName
+						}
 					}
-				}
-			});
+				});
 
 			res.send(`Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`);
 
diff --git a/src/file/server.ts b/src/file/server.ts
index 8ab638aa69..ee67cf7860 100644
--- a/src/file/server.ts
+++ b/src/file/server.ts
@@ -24,7 +24,7 @@ app.use(cors());
 /**
  * Statics
  */
-app.use('/assets', express.static(__dirname + '/assets', {
+app.use('/assets', express.static(`${__dirname}/assets`, {
 	maxAge: 1000 * 60 * 60 * 24 * 365 // 一年
 }));
 
@@ -33,12 +33,12 @@ app.get('/', (req, res) => {
 });
 
 app.get('/default-avatar.jpg', (req, res) => {
-	const file = fs.readFileSync(__dirname + '/assets/avatar.jpg');
+	const file = fs.readFileSync(`${__dirname}/assets/avatar.jpg`);
 	send(file, 'image/jpeg', req, res);
 });
 
 app.get('/app-default.jpg', (req, res) => {
-	const file = fs.readFileSync(__dirname + '/assets/dummy.png');
+	const file = fs.readFileSync(`${__dirname}/assets/dummy.png`);
 	send(file, 'image/png', req, res);
 });
 
@@ -54,7 +54,7 @@ async function raw(data: Buffer, type: string, download: boolean, res: express.R
 
 async function thumbnail(data: Buffer, type: string, resize: number, res: express.Response): Promise<any> {
 	if (!/^image\/.*$/.test(type)) {
-		data = fs.readFileSync(__dirname + '/assets/dummy.png');
+		data = fs.readFileSync(`${__dirname}/assets/dummy.png`);
 	}
 
 	let g = gm(data);
@@ -64,18 +64,18 @@ async function thumbnail(data: Buffer, type: string, resize: number, res: expres
 	}
 
 	g
-	.compress('jpeg')
-	.quality(80)
-	.toBuffer('jpeg', (err, img) => {
-		if (err !== undefined && err !== null) {
-			console.error(err);
-			res.sendStatus(500);
-			return;
-		}
+		.compress('jpeg')
+		.quality(80)
+		.toBuffer('jpeg', (err, img) => {
+			if (err !== undefined && err !== null) {
+				console.error(err);
+				res.sendStatus(500);
+				return;
+			}
 
-		res.header('Content-Type', 'image/jpeg');
-		res.send(img);
-	});
+			res.header('Content-Type', 'image/jpeg');
+			res.send(img);
+		});
 }
 
 function send(data: Buffer, type: string, req: express.Request, res: express.Response): void {
@@ -97,10 +97,10 @@ app.get('/:id', async (req, res) => {
 		return;
 	}
 
-	const file = await File.findOne({_id: new mongodb.ObjectID(req.params.id)});
+	const file = await File.findOne({ _id: new mongodb.ObjectID(req.params.id) });
 
 	if (file == null) {
-		res.status(404).sendFile(__dirname + '/assets/dummy.png');
+		res.status(404).sendFile(`${__dirname} / assets / dummy.png`);
 		return;
 	} else if (file.data == null) {
 		res.sendStatus(400);
@@ -117,10 +117,10 @@ app.get('/:id/:name', async (req, res) => {
 		return;
 	}
 
-	const file = await File.findOne({_id: new mongodb.ObjectID(req.params.id)});
+	const file = await File.findOne({ _id: new mongodb.ObjectID(req.params.id) });
 
 	if (file == null) {
-		res.status(404).sendFile(__dirname + '/assets/dummy.png');
+		res.status(404).sendFile(`${__dirname}/assets/dummy.png`);
 		return;
 	} else if (file.data == null) {
 		res.sendStatus(400);
diff --git a/src/himasaku/server.ts b/src/himasaku/server.ts
index 17edc66484..fb129513de 100644
--- a/src/himasaku/server.ts
+++ b/src/himasaku/server.ts
@@ -13,11 +13,11 @@ app.disable('x-powered-by');
 app.locals.cache = true;
 
 app.get('/himasaku.png', (req, res) => {
-	res.sendFile(__dirname + '/assets/himasaku.png');
+	res.sendFile(`${__dirname}/assets/himasaku.png`);
 });
 
 app.get('*', (req, res) => {
-	res.sendFile(__dirname + '/assets/index.html');
+	res.sendFile(`${__dirname}/assets/index.html`);
 });
 
 module.exports = app;
diff --git a/src/index.ts b/src/index.ts
index a820c8b757..15e17a16a3 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -12,7 +12,7 @@ import * as os from 'os';
 import * as cluster from 'cluster';
 import * as debug from 'debug';
 import * as chalk from 'chalk';
-//import portUsed = require('tcp-port-used');
+// import portUsed = require('tcp-port-used');
 import isRoot = require('is-root');
 import { master } from 'accesses';
 
diff --git a/src/utils/cli/progressbar.ts b/src/utils/cli/progressbar.ts
index f9b690a904..1a0023e8db 100644
--- a/src/utils/cli/progressbar.ts
+++ b/src/utils/cli/progressbar.ts
@@ -52,7 +52,7 @@ export default class extends ev.EventEmitter {
 
 	private render(): string {
 		const width = 30;
-		const t = this.text ? this.text + ' ' : '';
+		const t = this.text ? `${this.text} ` : '';
 
 		const v = Math.floor((this.value / this.max) * width);
 		const vs = new Array(v + 1).join('*');
@@ -61,7 +61,7 @@ export default class extends ev.EventEmitter {
 		const ps = new Array(p + 1).join(' ');
 
 		const percentage = Math.floor((this.value / this.max) * 100);
-		const percentages = chalk.gray(`(${percentage}%)`);
+		const percentages = chalk.gray(`(${percentage} %)`);
 
 		let i: string;
 		switch (this.indicator) {
@@ -72,7 +72,7 @@ export default class extends ev.EventEmitter {
 			case null: i = '+'; break;
 		}
 
-		return `${i} ${t}[${vs}${ps}] ${this.value}/${this.max} ${percentages}`;
+		return `${i} ${t}[${vs}${ps}] ${this.value} / ${this.max} ${percentages}`;
 	}
 }
 
diff --git a/src/web/server.ts b/src/web/server.ts
index cd3560d834..17e455b172 100644
--- a/src/web/server.ts
+++ b/src/web/server.ts
@@ -38,8 +38,8 @@ app.use((req, res, next) => {
  * Static assets
  */
 app.use(favicon(`${__dirname}/assets/favicon.ico`));
-app.get('/manifest.json', (req, res) => res.sendFile(__dirname + '/assets/manifest.json'));
-app.get('/apple-touch-icon.png', (req, res) => res.sendFile(__dirname + '/assets/apple-touch-icon.png'));
+app.get('/manifest.json', (req, res) => res.sendFile(`${__dirname}/assets/manifest.json`));
+app.get('/apple-touch-icon.png', (req, res) => res.sendFile(`${__dirname}/assets/apple-touch-icon.png`));
 app.use('/assets', express.static(`${__dirname}/assets`, {
 	maxAge: ms('7 days')
 }));
@@ -47,7 +47,7 @@ app.use('/assets', express.static(`${__dirname}/assets`, {
 /**
  * Common API
  */
-app.get(/\/api:url/,  require('./service/url-preview'));
+app.get(/\/api:url/, require('./service/url-preview'));
 app.post(/\/api:rss/, require('./service/rss-proxy'));
 
 /**
@@ -74,7 +74,7 @@ app.use(subdomain({
  */
 app.use(require('./about')); // about docs
 app.get('/@/auth/*', serveApp('auth')); // authorize form
-app.get('/@/dev/*',  serveApp('dev')); // developer center
-app.get('*',         serveApp('client')); // client
+app.get('/@/dev/*', serveApp('dev')); // developer center
+app.get('*', serveApp('client')); // client
 
 module.exports = app;
diff --git a/tslint.json b/tslint.json
index 644a7159ac..6f21b4b7ea 100644
--- a/tslint.json
+++ b/tslint.json
@@ -63,6 +63,7 @@
       true,
       "check-function-in-method"
     ],
+    "no-misused-new": true,
     "no-null-keyword": false,
     "no-shadowed-variable": false,
     "no-string-literal": false,
@@ -92,7 +93,10 @@
     "no-default-export": false,
     "no-mergeable-namespace": true,
     "no-require-imports": false,
+    "no-reference-import": true,
     "no-trailing-whitespace": true,
+    "no-unnecessary-callback-wrapper": true,
+    "no-unnecessary-initializer": true,
     "object-literal-sort-keys": false,
     "trailing-comma": true,
     // Style
@@ -102,8 +106,12 @@
       "statements"
     ],
     "arrow-parens": false,
+    "arrow-return-shorthand": true,
     "class-name": true,
-    "comment-format": false,
+    "comment-format": [
+      true,
+      "check-space"
+    ],
     "interface-name": false,
     "jsdoc-format": true,
     "match-default-export-name": false,
@@ -122,6 +130,9 @@
     ],
     "one-variable-per-declaration": true,
     "ordered-imports": false,
+    "prefer-function-over-method": true,
+    "prefer-method-signature": true,
+    "prefer-template": true,
     "quotemark": [
       true,
       "single",
@@ -135,7 +146,8 @@
       "check-decl",
       "check-operator",
       "check-separator",
-      "check-type"
+      "check-type",
+      "check-preblock"
     ]
   }
 }