Rewrite emoji_mart_data_light as TS (#25138)
				
					
				
			This commit is contained in:
		
							
								
								
									
										51
									
								
								app/javascript/mastodon/features/emoji/emoji_compressed.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								app/javascript/mastodon/features/emoji/emoji_compressed.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| import type { BaseEmoji, EmojiData, NimbleEmojiIndex } from 'emoji-mart'; | ||||
| import type { Category, Data, Emoji } from 'emoji-mart/dist-es/utils/data'; | ||||
|  | ||||
| /* | ||||
|  * The 'search' property, although not defined in the [`Emoji`]{@link node_modules/@types/emoji-mart/dist-es/utils/data.d.ts#Emoji} type, | ||||
|  * is used in the application. | ||||
|  * This could be due to an oversight by the library maintainer. | ||||
|  * The `search` property is defined and used [here]{@link node_modules/emoji-mart/dist/utils/data.js#uncompress}. | ||||
|  */ | ||||
| export type Search = string; | ||||
| /* | ||||
|  * The 'skins' property does not exist in the application data. | ||||
|  * 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; | ||||
|  | ||||
| export type FilenameData = string[] | string[][]; | ||||
| export type ShortCodesToEmojiDataKey = | ||||
|   | EmojiData['id'] | ||||
|   | BaseEmoji['native'] | ||||
|   | keyof NimbleEmojiIndex['emojis']; | ||||
|  | ||||
| export type SearchData = [ | ||||
|   BaseEmoji['native'], | ||||
|   Emoji['short_names'], | ||||
|   Search, | ||||
|   Emoji['unified'] | ||||
| ]; | ||||
|  | ||||
| export interface ShortCodesToEmojiData { | ||||
|   [key: ShortCodesToEmojiDataKey]: [FilenameData, SearchData]; | ||||
| } | ||||
| export type EmojisWithoutShortCodes = FilenameData[]; | ||||
|  | ||||
| export type EmojiCompressed = [ | ||||
|   ShortCodesToEmojiData, | ||||
|   Skins, | ||||
|   Category[], | ||||
|   Data['aliases'], | ||||
|   EmojisWithoutShortCodes | ||||
| ]; | ||||
|  | ||||
| /* | ||||
|  * `emoji_compressed.js` uses `babel-plugin-preval`, which makes it difficult to convert to TypeScript. | ||||
|  * As a temporary solution, we are allowing a default export here to apply the TypeScript type `EmojiCompressed` to the JS file export. | ||||
|  * - {@link app/javascript/mastodon/features/emoji/emoji_compressed.js} | ||||
|  */ | ||||
| declare const emojiCompressed: EmojiCompressed; | ||||
|  | ||||
| export default emojiCompressed; // eslint-disable-line import/no-default-export | ||||
| @@ -118,6 +118,16 @@ Object.keys(emojiIndex.emojis).forEach(key => { | ||||
| // inconsistent behavior in dev mode | ||||
| module.exports = JSON.parse(JSON.stringify([ | ||||
|   shortCodesToEmojiData, | ||||
|   /* | ||||
|    * The property `skins` is not found in the current context. | ||||
|    * This could potentially lead to issues when interacting with modules or data structures | ||||
|    * that expect the presence of `skins` property. | ||||
|    * Currently, no definitions or references to `skins` property can be found in: | ||||
|    * - {@link node_modules/emoji-mart/dist/utils/data.js} | ||||
|    * - {@link node_modules/emoji-mart/data/all.json} | ||||
|    * - {@link app/javascript/mastodon/features/emoji/emoji_compressed.d.ts#Skins} | ||||
|    * Future refactorings or updates should consider adding definitions or handling for `skins` property. | ||||
|    */ | ||||
|   emojiMartData.skins, | ||||
|   emojiMartData.categories, | ||||
|   emojiMartData.aliases, | ||||
|   | ||||
| @@ -1,43 +0,0 @@ | ||||
| // The output of this module is designed to mimic emoji-mart's | ||||
| // "data" object, such that we can use it for a light version of emoji-mart's | ||||
| // emojiIndex.search functionality. | ||||
| import emojiCompressed from './emoji_compressed'; | ||||
| import { unicodeToUnifiedName } from './unicode_to_unified_name'; | ||||
|  | ||||
| const [ shortCodesToEmojiData, skins, categories, short_names ] = emojiCompressed; | ||||
|  | ||||
| const emojis = {}; | ||||
|  | ||||
| // decompress | ||||
| Object.keys(shortCodesToEmojiData).forEach((shortCode) => { | ||||
|   let [ | ||||
|     filenameData, // eslint-disable-line @typescript-eslint/no-unused-vars | ||||
|     searchData, | ||||
|   ] = shortCodesToEmojiData[shortCode]; | ||||
|   let [ | ||||
|     native, | ||||
|     short_names, | ||||
|     search, | ||||
|     unified, | ||||
|   ] = searchData; | ||||
|  | ||||
|   if (!unified) { | ||||
|     // unified name can be derived from unicodeToUnifiedName | ||||
|     unified = unicodeToUnifiedName(native); | ||||
|   } | ||||
|  | ||||
|   short_names = [shortCode].concat(short_names); | ||||
|   emojis[shortCode] = { | ||||
|     native, | ||||
|     search, | ||||
|     short_names, | ||||
|     unified, | ||||
|   }; | ||||
| }); | ||||
|  | ||||
| export { | ||||
|   emojis, | ||||
|   skins, | ||||
|   categories, | ||||
|   short_names, | ||||
| }; | ||||
| @@ -0,0 +1,52 @@ | ||||
| // The output of this module is designed to mimic emoji-mart's | ||||
| // "data" object, such that we can use it for a light version of emoji-mart's | ||||
| // emojiIndex.search functionality. | ||||
| import type { BaseEmoji } from 'emoji-mart'; | ||||
| import type { Emoji } from 'emoji-mart/dist-es/utils/data'; | ||||
|  | ||||
| import type { Search, ShortCodesToEmojiData } from './emoji_compressed'; | ||||
| import emojiCompressed from './emoji_compressed'; | ||||
| import { unicodeToUnifiedName } from './unicode_to_unified_name'; | ||||
|  | ||||
| type Emojis = { | ||||
|   [key in keyof ShortCodesToEmojiData]: { | ||||
|     native: BaseEmoji['native']; | ||||
|     search: Search; | ||||
|     short_names: Emoji['short_names']; | ||||
|     unified: Emoji['unified']; | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| const [ | ||||
|   shortCodesToEmojiData, | ||||
|   skins, | ||||
|   categories, | ||||
|   short_names, | ||||
|   _emojisWithoutShortCodes, | ||||
| ] = emojiCompressed; | ||||
|  | ||||
| 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]; | ||||
|  | ||||
|   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, | ||||
|   }; | ||||
| }); | ||||
|  | ||||
| export { emojis, skins, categories, short_names }; | ||||
		Reference in New Issue
	
	Block a user