From 948281070335c61657783702ef7d19e49909bed5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=9F=E3=81=84=E3=81=A1=20=E3=81=B2?=
 <taichi221228@icloud.com>
Date: Tue, 24 Oct 2023 17:06:14 +0900
Subject: [PATCH] Rewrite `emoji_unicode_mapping_light` to TS (#25444)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: taichi.fukuda ひ <taichi.fukuda@systemi.co.jp>
---
 .../mastodon/components/autosuggest_emoji.jsx |  2 +-
 .../mastodon/features/emoji/emoji.js          |  2 +-
 .../features/emoji/emoji_compressed.d.ts      | 15 +++--
 .../features/emoji/emoji_mart_data_light.ts   | 15 +----
 .../emoji/emoji_unicode_mapping_light.js      | 37 ------------
 .../emoji/emoji_unicode_mapping_light.ts      | 60 +++++++++++++++++++
 .../components/announcements.jsx              |  2 +-
 7 files changed, 76 insertions(+), 57 deletions(-)
 delete mode 100644 app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.js
 create mode 100644 app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts

diff --git a/app/javascript/mastodon/components/autosuggest_emoji.jsx b/app/javascript/mastodon/components/autosuggest_emoji.jsx
index 5fa946f70..28f628b4a 100644
--- a/app/javascript/mastodon/components/autosuggest_emoji.jsx
+++ b/app/javascript/mastodon/components/autosuggest_emoji.jsx
@@ -3,7 +3,7 @@ import { PureComponent } from 'react';
 
 import { assetHost } from 'mastodon/utils/config';
 
-import unicodeMapping from '../features/emoji/emoji_unicode_mapping_light';
+import { unicodeMapping } from '../features/emoji/emoji_unicode_mapping_light';
 
 export default class AutosuggestEmoji extends PureComponent {
 
diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js
index c11ef458c..dd51dc621 100644
--- a/app/javascript/mastodon/features/emoji/emoji.js
+++ b/app/javascript/mastodon/features/emoji/emoji.js
@@ -4,7 +4,7 @@ import { assetHost } from 'mastodon/utils/config';
 
 import { autoPlayGif } from '../../initial_state';
 
-import unicodeMapping from './emoji_unicode_mapping_light';
+import { unicodeMapping } from './emoji_unicode_mapping_light';
 
 const trie = new Trie(Object.keys(unicodeMapping));
 
diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts b/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts
index 9f0feba06..bd41e5b83 100644
--- a/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts
+++ b/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts
@@ -13,15 +13,20 @@ export type Search = string;
  * This could be a potential area of refactoring or error handling.
  * The non-existence of 'skins' property is evident at [this location]{@link app/javascript/mastodon/features/emoji/emoji_compressed.js:121}.
  */
-export type Skins = null;
+type Skins = null;
 
-export type FilenameData = string[] | string[][];
+type Filename = string;
+type UnicodeFilename = string;
+export type FilenameData = [
+  filename: Filename,
+  unicodeFilename?: UnicodeFilename,
+][];
 export type ShortCodesToEmojiDataKey =
   | EmojiData['id']
   | BaseEmoji['native']
   | keyof NimbleEmojiIndex['emojis'];
 
-export type SearchData = [
+type SearchData = [
   BaseEmoji['native'],
   Emoji['short_names'],
   Search,
@@ -32,9 +37,9 @@ export type ShortCodesToEmojiData = Record<
   ShortCodesToEmojiDataKey,
   [FilenameData, SearchData]
 >;
-export type EmojisWithoutShortCodes = FilenameData[];
+type EmojisWithoutShortCodes = FilenameData;
 
-export type EmojiCompressed = [
+type EmojiCompressed = [
   ShortCodesToEmojiData,
   Skins,
   Category[],
diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts
index 142605b4b..ffca1f8b0 100644
--- a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts
+++ b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts
@@ -30,22 +30,13 @@ const emojis: Emojis = {};
 // decompress
 Object.keys(shortCodesToEmojiData).forEach((shortCode) => {
   const [_filenameData, searchData] = shortCodesToEmojiData[shortCode];
-  const native = searchData[0];
-  let short_names = searchData[1];
-  const search = searchData[2];
-  let unified = searchData[3];
+  const [native, short_names, search, unified] = searchData;
 
-  if (!unified) {
-    // unified name can be derived from unicodeToUnifiedName
-    unified = unicodeToUnifiedName(native);
-  }
-
-  if (short_names) short_names = [shortCode].concat(short_names);
   emojis[shortCode] = {
     native,
     search,
-    short_names,
-    unified,
+    short_names: short_names ? [shortCode].concat(short_names) : undefined,
+    unified: unified ?? unicodeToUnifiedName(native),
   };
 });
 
diff --git a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.js b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.js
deleted file mode 100644
index 3e3834580..000000000
--- a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// A mapping of unicode strings to an object containing the filename
-// (i.e. the svg filename) and a shortCode intended to be shown
-// as a "title" attribute in an HTML element (aka tooltip).
-
-import emojiCompressed from './emoji_compressed';
-import { unicodeToFilename } from './unicode_to_filename';
-
-const [
-  shortCodesToEmojiData,
-  _skins,
-  _categories,
-  _short_names,
-  emojisWithoutShortCodes,
-] = emojiCompressed;
-
-// decompress
-const unicodeMapping = {};
-
-function processEmojiMapData(emojiMapData, shortCode) {
-  let [ native, filename ] = emojiMapData;
-  if (!filename) {
-    // filename name can be derived from unicodeToFilename
-    filename = unicodeToFilename(native);
-  }
-  unicodeMapping[native] = {
-    shortCode: shortCode,
-    filename: filename,
-  };
-}
-
-Object.keys(shortCodesToEmojiData).forEach((shortCode) => {
-  let [ filenameData ] = shortCodesToEmojiData[shortCode];
-  filenameData.forEach(emojiMapData => processEmojiMapData(emojiMapData, shortCode));
-});
-emojisWithoutShortCodes.forEach(emojiMapData => processEmojiMapData(emojiMapData));
-
-export default unicodeMapping;
diff --git a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts
new file mode 100644
index 000000000..191419496
--- /dev/null
+++ b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts
@@ -0,0 +1,60 @@
+// A mapping of unicode strings to an object containing the filename
+// (i.e. the svg filename) and a shortCode intended to be shown
+// as a "title" attribute in an HTML element (aka tooltip).
+
+import type {
+  FilenameData,
+  ShortCodesToEmojiDataKey,
+} from './emoji_compressed';
+import emojiCompressed from './emoji_compressed';
+import { unicodeToFilename } from './unicode_to_filename';
+
+type UnicodeMapping = {
+  [key in FilenameData[number][0]]: {
+    shortCode: ShortCodesToEmojiDataKey;
+    filename: FilenameData[number][number];
+  };
+};
+
+const [
+  shortCodesToEmojiData,
+  _skins,
+  _categories,
+  _short_names,
+  emojisWithoutShortCodes,
+] = emojiCompressed;
+
+// decompress
+const unicodeMapping: UnicodeMapping = {};
+
+function processEmojiMapData(
+  emojiMapData: FilenameData[number],
+  shortCode?: ShortCodesToEmojiDataKey,
+) {
+  const [native, _filename] = emojiMapData;
+  let filename = emojiMapData[1];
+  if (!filename) {
+    // filename name can be derived from unicodeToFilename
+    filename = unicodeToFilename(native);
+  }
+  unicodeMapping[native] = {
+    shortCode,
+    filename,
+  };
+}
+
+Object.keys(shortCodesToEmojiData).forEach(
+  (shortCode: ShortCodesToEmojiDataKey) => {
+    if (shortCode === undefined) return;
+    const [filenameData, _searchData] = shortCodesToEmojiData[shortCode];
+    filenameData.forEach((emojiMapData) => {
+      processEmojiMapData(emojiMapData, shortCode);
+    });
+  },
+);
+
+emojisWithoutShortCodes.forEach((emojiMapData) => {
+  processEmojiMapData(emojiMapData);
+});
+
+export { unicodeMapping };
diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.jsx b/app/javascript/mastodon/features/getting_started/components/announcements.jsx
index 4182e5c93..a3f379ece 100644
--- a/app/javascript/mastodon/features/getting_started/components/announcements.jsx
+++ b/app/javascript/mastodon/features/getting_started/components/announcements.jsx
@@ -18,7 +18,7 @@ import { AnimatedNumber } from 'mastodon/components/animated_number';
 import { Icon }  from 'mastodon/components/icon';
 import { IconButton } from 'mastodon/components/icon_button';
 import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';
-import unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';
+import { unicodeMapping } from 'mastodon/features/emoji/emoji_unicode_mapping_light';
 import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'mastodon/initial_state';
 import { assetHost } from 'mastodon/utils/config';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';