{"version":3,"sources":["../src/index.ts"],"sourcesContent":["interface EmojiData {\n    emoji: string;\n    name: string;\n    group: EmojiGroup;\n    sub_group: EmojiSubGroup;\n    codepoints: string;\n}\n\nexport const emojis = require(\"./emojis.json\") as EmojiData[];\nconst cache = new Map<string, Emoji>();\nlet allCache: Emoji[], arranged: Record<EmojiGroup, Emoji[]>;\n\nexport type EmojiGroup = \"Smileys & Emotion\" | \"People & Body\" | \"Animals & Nature\" | \"Food & Drink\" | \"Travel & Places\" | \"Activities\" | \"Objects\" | \"Symbols\" | \"Flags\";\nexport type EmojiSubGroup = \"face-smiling\" | \"face-affection\" | \"face-tongue\" | \"face-hand\" | \"face-neutral-skeptical\" | \"face-sleepy\" | \"face-unwell\" | \"face-hat\" | \"face-glasses\" | \"face-concerned\" | \"face-negative\" | \"face-costume\" | \"cat-face\" | \"monkey-face\" | \"emotion\" | \"hand-fingers-open\" | \"hand-fingers-partial\" | \"hand-single-finger\" | \"hand-fingers-closed\" | \"hands\" | \"hand-prop\" | \"body-parts\" | \"person\" | \"person-gesture\" | \"person-role\" | \"person-fantasy\" | \"person-activity\" | \"person-sport\" | \"person-resting\" | \"family\" | \"person-symbol\" | \"animal-mammal\" | \"animal-bird\" | \"animal-amphibian\" | \"animal-reptile\" | \"animal-marine\" | \"animal-bug\" | \"plant-flower\" | \"plant-other\" | \"food-fruit\" | \"food-vegetable\" | \"food-prepared\" | \"food-asian\" | \"food-marine\" | \"food-sweet\" | \"drink\" | \"dishware\" | \"place-map\" | \"place-geographic\" | \"place-building\" | \"place-religious\" | \"place-other\" | \"transport-ground\" | \"transport-water\" | \"transport-air\" | \"hotel\" | \"time\" | \"sky & weather\" | \"event\" | \"award-medal\" | \"sport\" | \"game\" | \"arts & crafts\" | \"clothing\" | \"sound\" | \"music\" | \"musical-instrument\" | \"phone\" | \"computer\" | \"light & video\" | \"book-paper\" | \"money\" | \"mail\" | \"writing\" | \"office\" | \"lock\" | \"tool\" | \"science\" | \"medical\" | \"household\" | \"other-object\" | \"transport-sign\" | \"warning\" | \"arrow\" | \"religion\" | \"zodiac\" | \"av-symbol\" | \"gender\" | \"math\" | \"punctuation\" | \"currency\" | \"other-symbol\" | \"keycap\" | \"alphanum\" | \"geometric\" | \"flag\" | \"country-flag\" | \"subdivision-flag\";\n\nexport class Emoji {\n    /**\n     * Represents an emoji\n     * @param _data The emoji data\n     */\n    public constructor(private readonly _data: EmojiData) {}\n\n    /**\n     * The Emoji\n     */\n    public get emoji() {\n        return this._data.emoji;\n    }\n\n    /**\n     * The emoji name\n     */\n    public get name() {\n        return this._data.name;\n    }\n\n    /**\n     * The emoji name\n     */\n    public get formattedName() {\n        return (this._data.name).split(\" \").map(m => `${m.charAt(0).toUpperCase()}${m.substring(1).toLowerCase()}`).join(\" \");\n    }\n\n    /**\n     * The emoji group\n     */\n    public get group() {\n        return this._data.group;\n    }\n\n    /**\n     * The emoji subgroup\n     */\n    public get subGroup() {\n        return this._data.sub_group;\n    }\n\n    /**\n     * The emoji code points\n     */\n    public get codePoints() {\n        return this._data.codepoints.split(\" \");\n    }\n\n    /**\n     * Twemoji url of this emoji \n     */\n    public twemoji(opt?: { size?: string; format?: \"png\" | \"svg\" }) {\n        const { format, size } = (opt ??= { size: \"72x72\", format: \"png\" });\n        return `https://twemoji.maxcdn.com/v/latest/${format === 'svg' ? \"svg\" : size}/${this.toUnicode().toLowerCase()}.${format}`;\n    }\n\n    /**\n     * Returns fancy name of this emoji\n     */\n    public get fancyName() {\n        return `:${this.name.replace(/\\W/g, \"_\").toLowerCase()}:`;\n    }\n\n    /**\n     * Unicode of this emoji\n     */\n    public toUnicode() {\n        return emojiToUnicode(this.emoji);\n    }\n\n    /**\n     * String representation of this emoji\n     */\n    public toString() {\n        return this.emoji;\n    }\n\n    /**\n     * Array representation of this emoji\n     */\n    public toArray() {\n        return [this.toJSON()];\n    }\n\n    /**\n     * Static method to create emoji instance\n     * @param emoji The emoji data\n     */\n    public static from(emoji: EmojiData) {\n        return new Emoji(emoji);\n    }\n\n    /**\n     * JSON representation of this emoji\n     */\n    public toJSON() {\n        return {\n            ...this._data,\n            fancyName: this.fancyName,\n            twemoji: this.twemoji(),\n            unicode: this.toUnicode(),\n            formattedName: this.formattedName\n        };\n    }\n}\n\n/**\n * Returns all emoji\n */\nexport function all(): Emoji[] {\n    if (allCache) return allCache;\n    return allCache = emojis.map(m => new Emoji(m));\n}\n\n/**\n * Returns arranged emojis\n */\nexport function arrange() {\n    if (arranged) return arranged;\n    arranged = {} as any;\n    const every = all();\n\n    for (const emoji of every) {\n        arranged[emoji.group] ? arranged[emoji.group].push(emoji) : arranged[emoji.group] = [emoji];\n    }\n\n    return arranged;\n}\n\n/**\n * Get specific emoji\n * @param emoji The emoji to find\n */\nexport function get(emoji: string): Emoji | null {\n    if (cache.has(emoji)) return cache.get(emoji);\n    const found = all().find(em => em.emoji === emoji);\n    if (!found) return null;\n    cache.set(emoji, found);\n    return found;\n}\n\n/**\n * Filter emoji by its data\n * @param fn Filter fn\n */\nexport function filter(fn: (emoji: Emoji) => boolean): Emoji[] {\n    return all().filter(e => fn(e));\n}\n\n/**\n * Get random emoji\n */\nexport function random(): Emoji {\n    const emojis = all();\n    const em = emojis[Math.floor(Math.random() * emojis.length)];\n    return em;\n}\n\n/**\n * Get random emoji from a specific group\n * @param group The group name\n * @param subGroup The subgroup name\n */\nexport function randomFromGroup(group: EmojiGroup, subGroup?: EmojiSubGroup): Emoji {\n    const emojis = all();\n    const groupFilter = emojis.filter(g => g.group.toLowerCase() === group.toLowerCase() && !subGroup ? true : subGroup.toLowerCase() === g.subGroup.toLowerCase());\n    const em = groupFilter[Math.floor(Math.random() * groupFilter.length)];\n    return em;\n}\n\n/**\n * Find emoji by name\n * @param name The emoji name\n */\nexport function findByName(name: string): Emoji | null {\n    const found = all().find(e => e.name.toLowerCase() === name.toLowerCase());\n    return found || null;\n}\n\n/**\n * Convert emoji to unicode\n * @param emoji The emoji\n */\nexport function emojiToUnicode(emoji: string): string {\n    if (emoji.length === 1) return emoji.charCodeAt(0).toString(16);\n    let comp = ((emoji.charCodeAt(0) - 0xD800) * 0x400 + (emoji.charCodeAt(1) - 0xDC00) + 0x10000);\n    if (comp < 0) return emoji.charCodeAt(0).toString(16);\n    return comp.toString(16).toUpperCase();\n}\n\n/**\n * Convert unicode to emoji\n * @param unicode The unicode\n */\nexport function unicodeToEmoji(unicode: string): string {\n    return String.fromCodePoint(parseInt(unicode, 16));\n}"],"mappings":"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","names":["emojis"]}