From f59e1155f208e90c8537c3728e54307c04de878d Mon Sep 17 00:00:00 2001
From: tamaina <tamaina@hotmail.co.jp>
Date: Sat, 23 May 2020 23:21:09 +0900
Subject: [PATCH] refactor: use Object.fromEntries() instead of in-house
 implementation (#6401)

* refactor: use Object.fromEntries()
instead of in-house implementation

* Remove extra type assertions
---
 src/client/config.ts                       |  3 +--
 src/client/scripts/compose-notification.ts |  3 +--
 src/client/scripts/set-i18n-contexts.ts    |  3 +--
 src/prelude/array.ts                       | 15 ---------------
 src/server/api/openapi/description.ts      | 20 +++++++++-----------
 tsconfig.json                              |  3 +++
 6 files changed, 15 insertions(+), 32 deletions(-)

diff --git a/src/client/config.ts b/src/client/config.ts
index f71647a05..b9a476618 100644
--- a/src/client/config.ts
+++ b/src/client/config.ts
@@ -1,5 +1,4 @@
 import { clientDb, entries } from './db';
-import { fromEntries } from '../prelude/array';
 
 declare const _LANGS_: string[];
 declare const _VERSION_: string;
@@ -15,7 +14,7 @@ export const apiUrl = url + '/api';
 export const wsUrl = url.replace('http://', 'ws://').replace('https://', 'wss://') + '/streaming';
 export const lang = localStorage.getItem('lang');
 export const langs = _LANGS_;
-export const getLocale = async () => fromEntries((await entries(clientDb.i18n)) as [string, string][]);
+export const getLocale = async () => Object.fromEntries((await entries(clientDb.i18n)) as [string, string][]);
 export const version = _VERSION_;
 export const env = _ENV_;
 export const instanceName = siteName === 'Misskey' ? null : siteName;
diff --git a/src/client/scripts/compose-notification.ts b/src/client/scripts/compose-notification.ts
index 29eb515bf..c3281955e 100644
--- a/src/client/scripts/compose-notification.ts
+++ b/src/client/scripts/compose-notification.ts
@@ -1,13 +1,12 @@
 import getNoteSummary from '../../misc/get-note-summary';
 import getUserName from '../../misc/get-user-name';
 import { clientDb, get, bulkGet } from '../db';
-import { fromEntries } from '../../prelude/array';
 
 const getTranslation = (text: string): Promise<string> => get(text, clientDb.i18n);
 
 export default async function(type, data): Promise<[string, NotificationOptions]> {
 	const contexts = ['deletedNote', 'invisibleNote', 'withNFiles', '_cw.poll'];
-	const locale = fromEntries(await bulkGet(contexts, clientDb.i18n) as [string, string][]);
+	const locale = Object.fromEntries(await bulkGet(contexts, clientDb.i18n) as [string, string][]);
 
 	switch (type) {
 		case 'driveFileCreated': // TODO (Server Side)
diff --git a/src/client/scripts/set-i18n-contexts.ts b/src/client/scripts/set-i18n-contexts.ts
index 2eb76047f..872153e0b 100644
--- a/src/client/scripts/set-i18n-contexts.ts
+++ b/src/client/scripts/set-i18n-contexts.ts
@@ -1,7 +1,6 @@
 import VueI18n from 'vue-i18n';
 import { clientDb, clear, bulkSet } from '../db';
 import { deepEntries, delimitEntry } from 'deep-entries';
-import { fromEntries } from '../../prelude/array';
 
 export function setI18nContexts(lang: string, version: string, i18n: VueI18n, cleardb = false) {
 	return Promise.all([
@@ -13,6 +12,6 @@ export function setI18nContexts(lang: string, version: string, i18n: VueI18n, cl
 		const flatLocaleEntries = deepEntries(locale, delimitEntry) as [string, string][];
 		bulkSet(flatLocaleEntries, clientDb.i18n);
 		i18n.locale = lang;
-		i18n.setLocaleMessage(lang, fromEntries(flatLocaleEntries));
+		i18n.setLocaleMessage(lang, Object.fromEntries(flatLocaleEntries));
 	});
 }
diff --git a/src/prelude/array.ts b/src/prelude/array.ts
index 9e1dfead5..d63f0475d 100644
--- a/src/prelude/array.ts
+++ b/src/prelude/array.ts
@@ -129,21 +129,6 @@ export function cumulativeSum(xs: number[]): number[] {
 	return ys;
 }
 
-// Object.fromEntries()
-export function fromEntries<T extends readonly (readonly [PropertyKey, any])[]>(xs: T):
-	T[number] extends infer U
-		?
-			(
-				U extends readonly any[]
-					? (x: { [_ in U[0]]: U[1] }) => any
-					: never
-			) extends (x: infer V) => any
-				? V
-				: never
-		: never {
-	return xs.reduce((obj, [k, v]) => Object.assign(obj, { [k]: v }), {} as { [x: string]: any; });
-}
-
 export function toArray<T>(x: T | T[] | undefined): T[] {
 	return Array.isArray(x) ? x : x != null ? [x] : [];
 }
diff --git a/src/server/api/openapi/description.ts b/src/server/api/openapi/description.ts
index 4fff53ac9..15831b3c9 100644
--- a/src/server/api/openapi/description.ts
+++ b/src/server/api/openapi/description.ts
@@ -1,7 +1,5 @@
-import config from '../../../config';
 import endpoints from '../endpoints';
 import * as locale from '../../../../locales/';
-import { fromEntries } from '../../../prelude/array';
 import { kinds as kindsList } from '../kinds';
 
 export interface IKindInfo {
@@ -10,16 +8,16 @@ export interface IKindInfo {
 }
 
 export function kinds() {
-	const kinds = fromEntries(
+	const kinds = Object.fromEntries(
 		kindsList
 			.map(k => [k, {
 					endpoints: [],
-					descs: fromEntries(
+					descs: Object.fromEntries(
 						Object.keys(locale)
-							.map(l => [l, locale[l]._permissions[k] as string] as [string, string])
-						) as { [x: string]: string; }
-				}] as [ string, IKindInfo ])
-			) as { [x: string]: IKindInfo; };
+							.map(l => [l, locale[l]._permissions[k] as string])
+						)
+				} as IKindInfo])
+			);
 
 	const errors = [] as string[][];
 
@@ -37,17 +35,17 @@ export function kinds() {
 }
 
 export function getDescription(lang = 'ja-JP'): string {
-	const permissionTable = (Object.entries(kinds()) as [string, IKindInfo][])
+	const permissionTable = Object.entries(kinds())
 		.map(e => `|${e[0]}|${e[1].descs[lang]}|${e[1].endpoints.map(f => `[${f}](#operation/${f})`).join(', ')}|`)
 		.join('\n');
 
-	const descriptions = {
+	const descriptions: { [x: string]: string } = {
 		'ja-JP': `
 # Permissions
 |Permisson (kind)|Description|Endpoints|
 |:--|:--|:--|
 ${permissionTable}
 `
-	} as { [x: string]: string };
+	};
 	return lang in descriptions ? descriptions[lang] : descriptions['ja-JP'];
 }
diff --git a/tsconfig.json b/tsconfig.json
index b285259bc..260968c24 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -24,6 +24,9 @@
 		"typeRoots": [
 			"node_modules/@types",
 			"src/@types"
+		],
+		"lib": [
+			"esnext"
 		]
 	},
 	"compileOnSave": false,