From a70add24af373c39ff74c7275b4f2201e42203e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Wed, 16 Oct 2024 20:22:39 +0200 Subject: [PATCH 1/5] pl-fe: Remove fix for custom emojis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/pl-fe/package.json | 1 - packages/pl-fe/src/reducers/custom-emojis.ts | 22 ++------------------ 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 75262306a0..28837b1f94 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -132,7 +132,6 @@ "reselect": "^5.1.1", "resize-observer-polyfill": "^1.5.1", "sass": "^1.79.4", - "semver": "^7.6.3", "stringz": "^2.1.0", "tiny-queue": "^0.2.1", "tslib": "^2.7.0", diff --git a/packages/pl-fe/src/reducers/custom-emojis.ts b/packages/pl-fe/src/reducers/custom-emojis.ts index d6fe9f49e3..4273d44c90 100644 --- a/packages/pl-fe/src/reducers/custom-emojis.ts +++ b/packages/pl-fe/src/reducers/custom-emojis.ts @@ -1,5 +1,4 @@ import { buildCustomEmojis } from 'pl-fe/features/emoji'; -import emojiData from 'pl-fe/features/emoji/data'; import { addCustomToPool } from 'pl-fe/features/emoji/search'; import { CUSTOM_EMOJIS_FETCH_SUCCESS, type CustomEmojisAction } from '../actions/custom-emojis'; @@ -8,27 +7,10 @@ import type { CustomEmoji } from 'pl-api'; const initialState: Array = []; -// Populate custom emojis for composer autosuggest -const autosuggestPopulate = (emojis: Array) => { - addCustomToPool(buildCustomEmojis(emojis)); -}; - -const importEmojis = (customEmojis: Array) => { - const emojis = customEmojis.filter((emoji) => { - // If a custom emoji has the shortcode of a Unicode emoji, skip it. - // Otherwise it breaks EmojiMart. - // https://gitlab.com/soapbox-pub/soapbox/-/issues/610 - const shortcode = emoji.shortcode.toLowerCase(); - return !emojiData.emojis[shortcode]; - }); - - autosuggestPopulate(emojis); - return emojis; -}; - const custom_emojis = (state = initialState, action: CustomEmojisAction) => { if (action.type === CUSTOM_EMOJIS_FETCH_SUCCESS) { - return importEmojis(action.custom_emojis); + addCustomToPool(buildCustomEmojis(action.custom_emojis)); + return action.custom_emojis; } return state; From 3e45a3142b99c27bb950dd1c4730ed0e5d1f5468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Wed, 16 Oct 2024 23:27:12 +0200 Subject: [PATCH 2/5] pl-fe: WIP: Lazy load emoji data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/pl-fe/src/features/emoji/data.ts | 52 +-------- packages/pl-fe/src/features/emoji/index.ts | 2 +- packages/pl-fe/src/features/emoji/mapping.ts | 107 +------------------ packages/pl-fe/src/features/emoji/search.ts | 11 +- 4 files changed, 11 insertions(+), 161 deletions(-) diff --git a/packages/pl-fe/src/features/emoji/data.ts b/packages/pl-fe/src/features/emoji/data.ts index db8db115b7..6a560ff9c6 100644 --- a/packages/pl-fe/src/features/emoji/data.ts +++ b/packages/pl-fe/src/features/emoji/data.ts @@ -1,61 +1,11 @@ import data from '@emoji-mart/data/sets/14/twitter.json'; -interface NativeEmoji { - unified: string; - native: string; - x: number; - y: number; -} - -interface CustomEmoji { - src: string; -} - -interface Emoji { - id: string; - name: string; - keywords: string[]; - skins: T[]; - version?: number; -} - -interface EmojiCategory { - id: string; - emojis: string[]; -} - -interface EmojiMap { - [s: string]: Emoji; -} - -interface EmojiAlias { - [s: string]: string; -} - -interface EmojiSheet { - cols: number; - rows: number; -} - -interface EmojiData { - categories: EmojiCategory[]; - emojis: EmojiMap; - aliases: EmojiAlias; - sheet: EmojiSheet; -} +import type { EmojiData } from './types'; const emojiData = data as EmojiData; const { categories, emojis, aliases, sheet } = emojiData; export { - type NativeEmoji, - type CustomEmoji, - type Emoji, - type EmojiCategory, - type EmojiMap, - type EmojiAlias, - type EmojiSheet, - type EmojiData, categories, emojis, aliases, diff --git a/packages/pl-fe/src/features/emoji/index.ts b/packages/pl-fe/src/features/emoji/index.ts index 1e85fc74f3..2527d1cb1b 100644 --- a/packages/pl-fe/src/features/emoji/index.ts +++ b/packages/pl-fe/src/features/emoji/index.ts @@ -2,8 +2,8 @@ import split from 'graphemesplit'; import unicodeMapping from './mapping'; +import type { Emoji as EmojiMart, CustomEmoji as EmojiMartCustom } from './types'; import type { CustomEmoji as BaseCustomEmoji } from 'pl-api'; -import type { Emoji as EmojiMart, CustomEmoji as EmojiMartCustom } from 'pl-fe/features/emoji/data'; /* * TODO: Consolate emoji object types diff --git a/packages/pl-fe/src/features/emoji/mapping.ts b/packages/pl-fe/src/features/emoji/mapping.ts index 5d5ba507aa..d7fb32c52c 100644 --- a/packages/pl-fe/src/features/emoji/mapping.ts +++ b/packages/pl-fe/src/features/emoji/mapping.ts @@ -1,106 +1,3 @@ -import data, { EmojiData } from './data'; +import type { UnicodeMap } from './types'; -const stripLeadingZeros = /^0+/; -interface UnicodeMap { - [s: string]: { - unified: string; - shortcode: string; - }; -} - -/* - * Twemoji strips their hex codes from unicode codepoints to make it look "pretty" - * - leading 0s are removed - * - fe0f is removed unless it has 200d - * - fe0f is NOT removed for 1f441-fe0f-200d-1f5e8-fe0f even though it has a 200d - * - * this is all wrong - */ - -const blacklist = { - '1f441-fe0f-200d-1f5e8-fe0f': true, -}; - -const tweaks = { - '#⃣': ['23-20e3', 'hash'], - '*⃣': ['2a-20e3', 'keycap_star'], - '0⃣': ['30-20e3', 'zero'], - '1⃣': ['31-20e3', 'one'], - '2⃣': ['32-20e3', 'two'], - '3⃣': ['33-20e3', 'three'], - '4⃣': ['34-20e3', 'four'], - '5⃣': ['35-20e3', 'five'], - '6⃣': ['36-20e3', 'six'], - '7⃣': ['37-20e3', 'seven'], - '8⃣': ['38-20e3', 'eight'], - '9⃣': ['39-20e3', 'nine'], - '❤‍🔥': ['2764-fe0f-200d-1f525', 'heart_on_fire'], - '❤‍🩹': ['2764-fe0f-200d-1fa79', 'mending_heart'], - '👁‍🗨️': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], - '👁️‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], - '👁‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], - '🕵‍♂️': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], - '🕵️‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], - '🕵‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], - '🕵‍♀️': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], - '🕵️‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], - '🕵‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], - '🏌‍♂️': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], - '🏌️‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], - '🏌‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], - '🏌‍♀️': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], - '🏌️‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], - '🏌‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], - '⛹‍♂️': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], - '⛹️‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], - '⛹‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], - '⛹‍♀️': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], - '⛹️‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], - '⛹‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], - '🏋‍♂️': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], - '🏋️‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], - '🏋‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], - '🏋‍♀️': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], - '🏋️‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], - '🏋‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], - '🏳‍🌈': ['1f3f3-fe0f-200d-1f308', 'rainbow_flag'], - '🏳‍⚧️': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], - '🏳️‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], - '🏳‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], -}; - -const stripcodes = (unified: string, native: string) => { - const stripped = unified.replace(stripLeadingZeros, ''); - - if (unified.includes('200d') && !(unified in blacklist)) { - return stripped; - } else { - return stripped.replaceAll('-fe0f', ''); - } -}; - -const generateMappings = (data: EmojiData): UnicodeMap => { - const result: UnicodeMap = {}; - const emojis = Object.values(data.emojis ?? {}); - - for (const value of emojis) { - for (const item of value.skins) { - const { unified, native } = item; - const stripped = stripcodes(unified, native); - - result[native] = { unified: stripped, shortcode: value.id }; - } - } - - for (const [native, [unified, shortcode]] of Object.entries(tweaks)) { - const stripped = stripcodes(unified, native); - - result[native] = { unified: stripped, shortcode }; - } - - return result; -}; - -const unicodeMapping = generateMappings(data); - -export { generateMappings, unicodeMapping as default }; +export default import.meta.compileTime('./mapping-compiletime.ts'); diff --git a/packages/pl-fe/src/features/emoji/search.ts b/packages/pl-fe/src/features/emoji/search.ts index 0316f6445d..5e34595f42 100644 --- a/packages/pl-fe/src/features/emoji/search.ts +++ b/packages/pl-fe/src/features/emoji/search.ts @@ -1,17 +1,20 @@ import FlexSearch from 'flexsearch'; -import data from './data'; - import type { Emoji } from './index'; +import type { EmojiData } from './types'; import type { CustomEmoji } from 'pl-api'; +let emojis: EmojiData['emojis'] = {}; + +import('./data').then(data => emojis = data.emojis).catch(() => { }); + const index = new FlexSearch.Index({ tokenize: 'full', optimize: true, context: true, }); -const sortedEmojis = Object.entries(data.emojis).sort((a, b) => a[0].localeCompare(b[0])); +const sortedEmojis = Object.entries(emojis).sort((a, b) => a[0].localeCompare(b[0])); for (const [key, emoji] of sortedEmojis) { index.add('n' + key, `${emoji.id} ${emoji.name} ${emoji.keywords.join(' ')}`); } @@ -58,7 +61,7 @@ const search = ( } } - const skins = data.emojis[id.slice(1)]?.skins; + const skins = emojis[id.slice(1)]?.skins; if (skins) { return { From 8ae3adbe5a7a651ecc1b180bf9caa7b8dc301f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Wed, 16 Oct 2024 23:36:49 +0200 Subject: [PATCH 3/5] pl-fe: fix emoji search MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/pl-fe/src/features/emoji/search.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/pl-fe/src/features/emoji/search.ts b/packages/pl-fe/src/features/emoji/search.ts index 5e34595f42..c13f8ddb72 100644 --- a/packages/pl-fe/src/features/emoji/search.ts +++ b/packages/pl-fe/src/features/emoji/search.ts @@ -6,7 +6,14 @@ import type { CustomEmoji } from 'pl-api'; let emojis: EmojiData['emojis'] = {}; -import('./data').then(data => emojis = data.emojis).catch(() => { }); +import('./data').then(data => { + emojis = data.emojis; + + const sortedEmojis = Object.entries(emojis).sort((a, b) => a[0].localeCompare(b[0])); + for (const [key, emoji] of sortedEmojis) { + index.add('n' + key, `${emoji.id} ${emoji.name} ${emoji.keywords.join(' ')}`); + } +}).catch(() => { }); const index = new FlexSearch.Index({ tokenize: 'full', @@ -14,11 +21,6 @@ const index = new FlexSearch.Index({ context: true, }); -const sortedEmojis = Object.entries(emojis).sort((a, b) => a[0].localeCompare(b[0])); -for (const [key, emoji] of sortedEmojis) { - index.add('n' + key, `${emoji.id} ${emoji.name} ${emoji.keywords.join(' ')}`); -} - interface searchOptions { maxResults?: number; custom?: any; From 8ddc5a797c650c9e5aa7b7c15131344e37c494bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Thu, 17 Oct 2024 00:08:55 +0200 Subject: [PATCH 4/5] pl-fe: Lazy load emoji data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- .../src/features/emoji/mapping-compiletime.ts | 106 ++++++++++++++++++ packages/pl-fe/src/features/emoji/types.ts | 62 ++++++++++ 2 files changed, 168 insertions(+) create mode 100644 packages/pl-fe/src/features/emoji/mapping-compiletime.ts create mode 100644 packages/pl-fe/src/features/emoji/types.ts diff --git a/packages/pl-fe/src/features/emoji/mapping-compiletime.ts b/packages/pl-fe/src/features/emoji/mapping-compiletime.ts new file mode 100644 index 0000000000..67d094e9ac --- /dev/null +++ b/packages/pl-fe/src/features/emoji/mapping-compiletime.ts @@ -0,0 +1,106 @@ +import { createRequire } from 'node:module'; + +import type { EmojiData, UnicodeMap } from './types'; + +const require = createRequire(import.meta.url); +const data = require('@emoji-mart/data/sets/14/twitter.json'); + +const stripLeadingZeros = /^0+/; + +/* + * Twemoji strips their hex codes from unicode codepoints to make it look "pretty" + * - leading 0s are removed + * - fe0f is removed unless it has 200d + * - fe0f is NOT removed for 1f441-fe0f-200d-1f5e8-fe0f even though it has a 200d + * + * this is all wrong + */ +const blacklist = { + '1f441-fe0f-200d-1f5e8-fe0f': true, +}; + +const tweaks = { + '#⃣': ['23-20e3', 'hash'], + '*⃣': ['2a-20e3', 'keycap_star'], + '0⃣': ['30-20e3', 'zero'], + '1⃣': ['31-20e3', 'one'], + '2⃣': ['32-20e3', 'two'], + '3⃣': ['33-20e3', 'three'], + '4⃣': ['34-20e3', 'four'], + '5⃣': ['35-20e3', 'five'], + '6⃣': ['36-20e3', 'six'], + '7⃣': ['37-20e3', 'seven'], + '8⃣': ['38-20e3', 'eight'], + '9⃣': ['39-20e3', 'nine'], + '❤‍🔥': ['2764-fe0f-200d-1f525', 'heart_on_fire'], + '❤‍🩹': ['2764-fe0f-200d-1fa79', 'mending_heart'], + '👁‍🗨️': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], + '👁️‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], + '👁‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], + '🕵‍♂️': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], + '🕵️‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], + '🕵‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], + '🕵‍♀️': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], + '🕵️‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], + '🕵‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], + '🏌‍♂️': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], + '🏌️‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], + '🏌‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], + '🏌‍♀️': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], + '🏌️‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], + '🏌‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], + '⛹‍♂️': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], + '⛹️‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], + '⛹‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], + '⛹‍♀️': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], + '⛹️‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], + '⛹‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], + '🏋‍♂️': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], + '🏋️‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], + '🏋‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], + '🏋‍♀️': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], + '🏋️‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], + '🏋‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], + '🏳‍🌈': ['1f3f3-fe0f-200d-1f308', 'rainbow_flag'], + '🏳‍⚧️': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], + '🏳️‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], + '🏳‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], +}; + +const stripcodes = (unified: string, native: string) => { + const stripped = unified.replace(stripLeadingZeros, ''); + + if (unified.includes('200d') && !(unified in blacklist)) { + return stripped; + } else { + return stripped.replaceAll('-fe0f', ''); + } +}; + +const generateMappings = (emojiMap: EmojiData['emojis']): UnicodeMap => { + const result: UnicodeMap = {}; + const emojis = Object.values(emojiMap ?? {}); + + for (const value of emojis) { + for (const item of value.skins) { + const { unified, native } = item; + const stripped = stripcodes(unified, native); + + result[native] = { unified: stripped, shortcode: value.id }; + } + } + + for (const [native, [unified, shortcode]] of Object.entries(tweaks)) { + const stripped = stripcodes(unified, native); + + result[native] = { unified: stripped, shortcode }; + } + + return result; +}; + +const unicodeMapping = generateMappings(data.emojis); + +export default () => ({ + data: unicodeMapping, +}); diff --git a/packages/pl-fe/src/features/emoji/types.ts b/packages/pl-fe/src/features/emoji/types.ts new file mode 100644 index 0000000000..d1cbbf4502 --- /dev/null +++ b/packages/pl-fe/src/features/emoji/types.ts @@ -0,0 +1,62 @@ +interface UnicodeMap { + [s: string]: { + unified: string; + shortcode: string; + }; +} + +interface NativeEmoji { + unified: string; + native: string; + x: number; + y: number; +} + +interface CustomEmoji { + src: string; +} + +interface Emoji { + id: string; + name: string; + keywords: string[]; + skins: T[]; + version?: number; +} + +interface EmojiCategory { + id: string; + emojis: string[]; +} + +interface EmojiMap { + [s: string]: Emoji; +} + +interface EmojiAlias { + [s: string]: string; +} + +interface EmojiSheet { + cols: number; + rows: number; +} + +interface EmojiData { + categories: EmojiCategory[]; + emojis: EmojiMap; + aliases: EmojiAlias; + sheet: EmojiSheet; +} + +export type { + UnicodeMap, + NativeEmoji, + CustomEmoji, + Emoji, + EmojiCategory, + EmojiMap, + EmojiAlias, + EmojiSheet, + EmojiData, +}; From 9e723fcf95d11e04fa0225da1606e28cfaa33901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Thu, 17 Oct 2024 00:14:27 +0200 Subject: [PATCH 5/5] pl-fe: fix type definitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- packages/pl-fe/src/features/emoji/data.ts | 52 +++++++++++++++- packages/pl-fe/src/features/emoji/index.ts | 2 +- .../src/features/emoji/mapping-compiletime.ts | 3 +- packages/pl-fe/src/features/emoji/mapping.ts | 9 ++- packages/pl-fe/src/features/emoji/search.ts | 2 +- packages/pl-fe/src/features/emoji/types.ts | 62 ------------------- 6 files changed, 63 insertions(+), 67 deletions(-) delete mode 100644 packages/pl-fe/src/features/emoji/types.ts diff --git a/packages/pl-fe/src/features/emoji/data.ts b/packages/pl-fe/src/features/emoji/data.ts index 6a560ff9c6..db8db115b7 100644 --- a/packages/pl-fe/src/features/emoji/data.ts +++ b/packages/pl-fe/src/features/emoji/data.ts @@ -1,11 +1,61 @@ import data from '@emoji-mart/data/sets/14/twitter.json'; -import type { EmojiData } from './types'; +interface NativeEmoji { + unified: string; + native: string; + x: number; + y: number; +} + +interface CustomEmoji { + src: string; +} + +interface Emoji { + id: string; + name: string; + keywords: string[]; + skins: T[]; + version?: number; +} + +interface EmojiCategory { + id: string; + emojis: string[]; +} + +interface EmojiMap { + [s: string]: Emoji; +} + +interface EmojiAlias { + [s: string]: string; +} + +interface EmojiSheet { + cols: number; + rows: number; +} + +interface EmojiData { + categories: EmojiCategory[]; + emojis: EmojiMap; + aliases: EmojiAlias; + sheet: EmojiSheet; +} const emojiData = data as EmojiData; const { categories, emojis, aliases, sheet } = emojiData; export { + type NativeEmoji, + type CustomEmoji, + type Emoji, + type EmojiCategory, + type EmojiMap, + type EmojiAlias, + type EmojiSheet, + type EmojiData, categories, emojis, aliases, diff --git a/packages/pl-fe/src/features/emoji/index.ts b/packages/pl-fe/src/features/emoji/index.ts index 2527d1cb1b..aafe331d6a 100644 --- a/packages/pl-fe/src/features/emoji/index.ts +++ b/packages/pl-fe/src/features/emoji/index.ts @@ -2,7 +2,7 @@ import split from 'graphemesplit'; import unicodeMapping from './mapping'; -import type { Emoji as EmojiMart, CustomEmoji as EmojiMartCustom } from './types'; +import type { Emoji as EmojiMart, CustomEmoji as EmojiMartCustom } from './data'; import type { CustomEmoji as BaseCustomEmoji } from 'pl-api'; /* diff --git a/packages/pl-fe/src/features/emoji/mapping-compiletime.ts b/packages/pl-fe/src/features/emoji/mapping-compiletime.ts index 67d094e9ac..f5ef8cdf0a 100644 --- a/packages/pl-fe/src/features/emoji/mapping-compiletime.ts +++ b/packages/pl-fe/src/features/emoji/mapping-compiletime.ts @@ -1,6 +1,7 @@ import { createRequire } from 'node:module'; -import type { EmojiData, UnicodeMap } from './types'; +import type { EmojiData } from './data'; +import type { UnicodeMap } from './mapping'; const require = createRequire(import.meta.url); const data = require('@emoji-mart/data/sets/14/twitter.json'); diff --git a/packages/pl-fe/src/features/emoji/mapping.ts b/packages/pl-fe/src/features/emoji/mapping.ts index d7fb32c52c..a76d52245f 100644 --- a/packages/pl-fe/src/features/emoji/mapping.ts +++ b/packages/pl-fe/src/features/emoji/mapping.ts @@ -1,3 +1,10 @@ -import type { UnicodeMap } from './types'; +interface UnicodeMap { + [s: string]: { + unified: string; + shortcode: string; + }; +} export default import.meta.compileTime('./mapping-compiletime.ts'); + +export type { UnicodeMap }; diff --git a/packages/pl-fe/src/features/emoji/search.ts b/packages/pl-fe/src/features/emoji/search.ts index c13f8ddb72..286873ca75 100644 --- a/packages/pl-fe/src/features/emoji/search.ts +++ b/packages/pl-fe/src/features/emoji/search.ts @@ -1,7 +1,7 @@ import FlexSearch from 'flexsearch'; +import type { EmojiData } from './data'; import type { Emoji } from './index'; -import type { EmojiData } from './types'; import type { CustomEmoji } from 'pl-api'; let emojis: EmojiData['emojis'] = {}; diff --git a/packages/pl-fe/src/features/emoji/types.ts b/packages/pl-fe/src/features/emoji/types.ts deleted file mode 100644 index d1cbbf4502..0000000000 --- a/packages/pl-fe/src/features/emoji/types.ts +++ /dev/null @@ -1,62 +0,0 @@ -interface UnicodeMap { - [s: string]: { - unified: string; - shortcode: string; - }; -} - -interface NativeEmoji { - unified: string; - native: string; - x: number; - y: number; -} - -interface CustomEmoji { - src: string; -} - -interface Emoji { - id: string; - name: string; - keywords: string[]; - skins: T[]; - version?: number; -} - -interface EmojiCategory { - id: string; - emojis: string[]; -} - -interface EmojiMap { - [s: string]: Emoji; -} - -interface EmojiAlias { - [s: string]: string; -} - -interface EmojiSheet { - cols: number; - rows: number; -} - -interface EmojiData { - categories: EmojiCategory[]; - emojis: EmojiMap; - aliases: EmojiAlias; - sheet: EmojiSheet; -} - -export type { - UnicodeMap, - NativeEmoji, - CustomEmoji, - Emoji, - EmojiCategory, - EmojiMap, - EmojiAlias, - EmojiSheet, - EmojiData, -};