@involvex/emoji-cli 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // bin/emoji-cli.ts
32
+ var emoji_cli_exports = {};
33
+ __export(emoji_cli_exports, {
34
+ default: () => run
35
+ });
36
+ module.exports = __toCommonJS(emoji_cli_exports);
37
+
38
+ // src/emojify.ts
39
+ var import_is2 = __toESM(require("@sindresorhus/is"), 1);
40
+
41
+ // src/findByName.ts
42
+ var import_is = require("@sindresorhus/is");
43
+
44
+ // src/data.ts
45
+ var import_emojilib = __toESM(require("emojilib"), 1);
46
+
47
+ // src/utils.ts
48
+ var import_char_regex = __toESM(require("char-regex"), 1);
49
+ var charRegexMatcher = (0, import_char_regex.default)();
50
+ function asFunction(input) {
51
+ return typeof input === "function" ? input : () => input;
52
+ }
53
+ var NON_SPACING_MARK = String.fromCharCode(65039);
54
+ var nonSpacingRegex = new RegExp(NON_SPACING_MARK, "g");
55
+ function normalizeCode(code) {
56
+ return code.replace(nonSpacingRegex, "");
57
+ }
58
+ function normalizeName(name) {
59
+ return /:.+:/.test(name) ? name.slice(1, -1) : name;
60
+ }
61
+ function randomItem(array) {
62
+ return array[Math.floor(Math.random() * array.length)];
63
+ }
64
+
65
+ // src/data.ts
66
+ var emojiData = Object.entries(import_emojilib.default.lib).map(
67
+ ([name, { char: emoji }]) => [name, emoji]
68
+ );
69
+ var emojiCodesByName = new Map(emojiData);
70
+ var emojiNamesByCode = new Map(
71
+ emojiData.map(([name, emoji]) => [normalizeCode(emoji), name])
72
+ );
73
+
74
+ // src/findByName.ts
75
+ var findByName = (name) => {
76
+ import_is.assert.string(name);
77
+ const nameNormalized = normalizeName(name);
78
+ const emoji = emojiCodesByName.get(nameNormalized);
79
+ return emoji ? { emoji, key: nameNormalized } : void 0;
80
+ };
81
+
82
+ // src/emojify.ts
83
+ var emojify = (input, { fallback, format = (name) => name } = {}) => {
84
+ const fallbackFunction = fallback === void 0 ? fallback : asFunction(fallback);
85
+ import_is2.default.assert.string(input);
86
+ import_is2.default.assert.any([import_is2.default.default.undefined, import_is2.default.default.function_], fallbackFunction);
87
+ import_is2.default.assert.function_(format);
88
+ return input.replace(/:[\w\-+]+:/g, (part) => {
89
+ const found = findByName(part);
90
+ if (found) {
91
+ return format(found.emoji, part, input);
92
+ }
93
+ if (fallbackFunction) {
94
+ return format(fallbackFunction(normalizeName(part)));
95
+ }
96
+ return format(part);
97
+ });
98
+ };
99
+
100
+ // src/findByCode.ts
101
+ var import_is3 = require("@sindresorhus/is");
102
+ var findByCode = (code) => {
103
+ import_is3.assert.string(code);
104
+ const emojiNormalized = normalizeCode(code);
105
+ const key = emojiNamesByCode.get(emojiNormalized);
106
+ return key ? { emoji: emojiNormalized, key } : void 0;
107
+ };
108
+
109
+ // src/find.ts
110
+ var find = (codeOrName) => {
111
+ return findByCode(codeOrName) ?? findByName(codeOrName);
112
+ };
113
+
114
+ // src/get.ts
115
+ var import_is4 = require("@sindresorhus/is");
116
+ var get = (codeOrName) => {
117
+ import_is4.assert.string(codeOrName);
118
+ return emojiCodesByName.get(normalizeName(codeOrName));
119
+ };
120
+
121
+ // src/has.ts
122
+ var import_is5 = require("@sindresorhus/is");
123
+ var has = (codeOrName) => {
124
+ import_is5.assert.string(codeOrName);
125
+ return emojiCodesByName.has(normalizeName(codeOrName)) || emojiNamesByCode.has(normalizeCode(codeOrName));
126
+ };
127
+
128
+ // src/random.ts
129
+ var random = () => {
130
+ const [name, emoji] = randomItem(emojiData);
131
+ return { emoji, name };
132
+ };
133
+
134
+ // src/replace.ts
135
+ var import_is6 = require("@sindresorhus/is");
136
+
137
+ // src/search.ts
138
+ var import_is7 = __toESM(require("@sindresorhus/is"), 1);
139
+ var search = (keyword) => {
140
+ import_is7.assert.any([import_is7.default.default.string, import_is7.default.default.regExp], keyword);
141
+ if (import_is7.default.default.string(keyword)) {
142
+ keyword = normalizeName(keyword);
143
+ }
144
+ if (import_is7.default.default.regExp(keyword)) {
145
+ const normalizedPattern = normalizeName(keyword.source);
146
+ keyword = new RegExp(normalizedPattern);
147
+ }
148
+ return emojiData.filter(([name]) => name.match(keyword)).map(([name, emoji]) => ({ emoji, name }));
149
+ };
150
+
151
+ // src/unemojify.ts
152
+ var import_is9 = require("@sindresorhus/is");
153
+
154
+ // src/which.ts
155
+ var import_is8 = require("@sindresorhus/is");
156
+ var import_skin_tone = __toESM(require("skin-tone"), 1);
157
+ var which = (emoji, { markdown = false } = {}) => {
158
+ import_is8.assert.string(emoji);
159
+ import_is8.assert.boolean(markdown);
160
+ const result = findByCode((0, import_skin_tone.default)(emoji, "none"));
161
+ if (result === void 0) {
162
+ return void 0;
163
+ }
164
+ return markdown ? `:${result.key}:` : result.key;
165
+ };
166
+
167
+ // src/unemojify.ts
168
+ var unemojify = (input) => {
169
+ import_is9.assert.string(input);
170
+ const characters = input.match(charRegexMatcher);
171
+ if (characters === null) {
172
+ return input;
173
+ }
174
+ return characters.map((character) => which(character, { markdown: true }) ?? character).join("");
175
+ };
176
+
177
+ // bin/emoji-cli.ts
178
+ function run() {
179
+ console.log("Emoji cli");
180
+ const args = process.argv.slice(2);
181
+ const command = args[0];
182
+ if (!command || command === "--help" || command === "-h") {
183
+ showhelp();
184
+ return;
185
+ }
186
+ switch (command) {
187
+ case "--help":
188
+ case "-h":
189
+ showhelp();
190
+ break;
191
+ case "--search":
192
+ runsearch(args[1]);
193
+ break;
194
+ case "--emojify":
195
+ runemojify(args[1]);
196
+ break;
197
+ case "--unemojify":
198
+ rununemojify(args[1]);
199
+ break;
200
+ case "--get":
201
+ runget(args[1]);
202
+ break;
203
+ case "--has":
204
+ runhas(args[1]);
205
+ break;
206
+ case "--find":
207
+ case "-f":
208
+ runfind(args[1]);
209
+ break;
210
+ case "--random":
211
+ case "--rnd":
212
+ case "-r":
213
+ runrandom();
214
+ break;
215
+ default:
216
+ showhelp();
217
+ break;
218
+ }
219
+ function showhelp() {
220
+ console.log("Help:");
221
+ console.log("Commands: --search --emojify --unemojify --get --has --random --find");
222
+ }
223
+ }
224
+ function runsearch(args) {
225
+ console.log("searching for: ", args);
226
+ search(args);
227
+ console.log(search(args));
228
+ }
229
+ function runemojify(args) {
230
+ console.log(emojify(args));
231
+ }
232
+ function rununemojify(args) {
233
+ console.log(unemojify(args));
234
+ }
235
+ function runget(args) {
236
+ console.log(get(args));
237
+ }
238
+ function runhas(args) {
239
+ console.log(has(args));
240
+ }
241
+ function runfind(args) {
242
+ console.log(find(args));
243
+ }
244
+ function runrandom() {
245
+ console.log(random());
246
+ }
247
+ run();
248
+ //# sourceMappingURL=emoji-cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bin/emoji-cli.ts","../src/emojify.ts","../src/findByName.ts","../src/data.ts","../src/utils.ts","../src/findByCode.ts","../src/find.ts","../src/get.ts","../src/has.ts","../src/random.ts","../src/replace.ts","../src/search.ts","../src/unemojify.ts","../src/which.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cli from '../src/index.ts'\nexport default function run() {\n console.log('Emoji cli')\n const args = process.argv.slice(2)\n const command = args[0]\n\n if (!command || command === '--help' || command === '-h') {\n showhelp()\n return\n }\n\n switch (command) {\n case '--help':\n case '-h':\n showhelp()\n break;\n case '--search':\n runsearch(args[1]);\n break;\n case '--emojify':\n runemojify(args[1]); \n break; \n case '--unemojify':\n rununemojify(args[1]); \n break;\n case '--get':\n runget(args[1]); \n break; \n case '--has':\n runhas(args[1]); \n break; \n case '--find':\n case '-f': \n runfind(args[1]); \n break; \n case '--random':\n case '--rnd':\n case '-r': \n runrandom(); \n break; \n default:\n showhelp();\n break; \n }\n\n function showhelp() {\n console.log('Help:');\n console.log('Commands: --search --emojify --unemojify --get --has --random --find');\n }\n}\n\nfunction runsearch(args: string){\n console.log(\"searching for: \", args)\n cli.search(args);\n console.log(cli.search(args));\n}\n\nfunction runemojify(args: string){\n console.log(cli.emojify(args));\n}\n\nfunction rununemojify(args: string){\n console.log(cli.unemojify(args));\n}\n\nfunction runget(args: string){\n console.log(cli.get(args));\n}\n\nfunction runhas(args: string){\n console.log(cli.has(args));\n}\n\nfunction runfind(args: string){\n console.log(cli.find(args));\n}\n\nfunction runrandom(){\n console.log(cli.random());\n}\n\n\nrun()\n","import is from '@sindresorhus/is'\n\nimport { findByName } from './findByName.js'\nimport { asFunction, normalizeName } from './utils.js'\n\nexport type EmojifyFormat = (\n name: string,\n part?: string,\n input?: string,\n) => string\n\nexport interface EmojifyOptions {\n /**\n * The string to fallback to if an emoji was not found.\n */\n fallback?: ((part: string) => string) | string\n\n /**\n * Adds a middleware layer to modify each matched emoji after parsing.\n */\n format?: EmojifyFormat\n}\n\n/**\n * Parse all markdown-encoded emojis in a string.\n */\nexport const emojify = (\n input: string,\n { fallback, format = name => name }: EmojifyOptions = {},\n) => {\n const fallbackFunction =\n fallback === undefined ? fallback : asFunction(fallback)\n\n is.assert.string(input)\n is.assert.any([is.default.undefined, is.default.function_], fallbackFunction)\n is.assert.function_(format)\n\n return input.replace(/:[\\w\\-+]+:/g, part => {\n const found = findByName(part)\n if (found) {\n return format(found.emoji, part, input)\n }\n\n if (fallbackFunction) {\n return format(fallbackFunction(normalizeName(part)))\n }\n\n return format(part)\n })\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiCodesByName } from './data.js'\nimport { normalizeName } from './utils.js'\n\nexport const findByName = (name: string) => {\n assert.string(name)\n\n const nameNormalized = normalizeName(name)\n const emoji = emojiCodesByName.get(nameNormalized)\n\n return emoji ? { emoji, key: nameNormalized } : undefined\n}\n","import emojilib from 'emojilib'\n\nimport { normalizeCode } from './utils.js'\n\nexport interface Emoji {\n emoji: string\n key: string\n}\n\nexport const emojiData = Object.entries(emojilib.lib).map(\n ([name, { char: emoji }]) => [name, emoji] as const,\n)\n\nexport const emojiCodesByName = new Map(emojiData)\n\nexport const emojiNamesByCode = new Map(\n emojiData.map(([name, emoji]) => [normalizeCode(emoji), name]),\n)\n","import charRegex from 'char-regex'\n\nexport const charRegexMatcher = charRegex()\n\nexport function asFunction<T extends PropertyKey, Args extends unknown[]>(\n input: ((...args: Args) => T) | T,\n): (...args: Args) => T {\n return typeof input === 'function' ? input : () => input\n}\n\n/**\n * Non spacing mark contained by some emoticons (65039 - '️' - 0xFE0F).\n *\n * It's the 'Variant Form', which provides more information so that emoticons\n * can be rendered as more colorful graphics. FE0E is a unicode text version\n * whereas FE0F should be rendered as a graphical version.\n * The code gracefully degrades.\n */\nconst NON_SPACING_MARK = String.fromCharCode(65039)\n\nconst nonSpacingRegex = new RegExp(NON_SPACING_MARK, 'g')\n\n/**\n * Removes the non-spacing-mark from the emoji code.\n *\n * Never send a stripped version to clients, as it kills graphical emoticons.\n */\nexport function normalizeCode(code: string) {\n return code.replace(nonSpacingRegex, '')\n}\n\nexport function normalizeName(name: string) {\n return /:.+:/.test(name) ? name.slice(1, -1) : name\n}\n\nexport function randomItem<T>(array: T[]) {\n return array[Math.floor(Math.random() * array.length)]\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiNamesByCode } from './data.js'\nimport { normalizeCode } from './utils.js'\n\nexport const findByCode = (code: string) => {\n assert.string(code)\n\n const emojiNormalized = normalizeCode(code)\n const key = emojiNamesByCode.get(emojiNormalized)\n\n return key ? { emoji: emojiNormalized, key } : undefined\n}\n","import { findByCode } from './findByCode.js'\nimport { findByName } from './findByName.js'\n\n/**\n * Get the name and character of an emoji.\n */\nexport const find = (codeOrName: string) => {\n return findByCode(codeOrName) ?? findByName(codeOrName)\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiCodesByName } from './data.js'\nimport { normalizeName } from './utils.js'\n\n/**\n * Get an emoji from an emoji name.\n */\nexport const get = (codeOrName: string) => {\n assert.string(codeOrName)\n\n return emojiCodesByName.get(normalizeName(codeOrName))\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiCodesByName, emojiNamesByCode } from './data.js'\nimport { normalizeCode, normalizeName } from './utils.js'\n\n/**\n * Check if this library supports a specific emoji.\n */\nexport const has = (codeOrName: string) => {\n assert.string(codeOrName)\n\n return (\n emojiCodesByName.has(normalizeName(codeOrName)) ||\n emojiNamesByCode.has(normalizeCode(codeOrName))\n )\n}\n","import { emojiData } from './data.js'\nimport { randomItem } from './utils.js'\n\n/**\n * Get a random emoji.\n */\nexport const random = () => {\n const [name, emoji] = randomItem(emojiData)\n return { emoji, name }\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { Emoji } from './data.js'\nimport { findByCode } from './findByCode.js'\nimport { asFunction, charRegexMatcher } from './utils.js'\n\nexport type ReplaceReplacement = (\n emoji: Emoji,\n index: number,\n string: string,\n) => string\n\n/**\n * Replace the emojis in a string.\n */\nexport const replace = (\n input: string,\n replacement: ReplaceReplacement | string,\n { preserveSpaces = false } = {},\n) => {\n const replace = asFunction(replacement)\n\n assert.string(input)\n assert.function_(replace)\n assert.boolean(preserveSpaces)\n\n const characters = input.match(charRegexMatcher)\n if (characters === null) {\n return input\n }\n\n return characters\n .map((character, index) => {\n const found = findByCode(character)\n if (!found) {\n return character\n }\n\n if (!preserveSpaces && characters[index + 1] === ' ') {\n characters[index + 1] = ''\n }\n\n return replace(found, index, input)\n })\n .join('')\n}\n","import is, { assert } from '@sindresorhus/is'\n\nimport { emojiData } from './data.js'\nimport { normalizeName } from './utils.js'\n\n/**\n * Search for emojis containing the provided name or pattern in their name.\n */\nexport const search = (keyword: RegExp | string) => {\n assert.any([is.default.string, is.default.regExp], keyword)\n\n if (is.default.string(keyword)) {\n keyword = normalizeName(keyword)\n }\n\n if (is.default.regExp(keyword)) {\n const normalizedPattern = normalizeName(keyword.source)\n keyword = new RegExp(normalizedPattern)\n }\n\n return emojiData\n .filter(([name]) => name.match(keyword))\n .map(([name, emoji]) => ({ emoji, name }))\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { charRegexMatcher } from './utils.js'\nimport { which } from './which.js'\n\n/**\n * Convert all emojis in a string to their markdown-encoded counterparts.\n */\nexport const unemojify = (input: string) => {\n assert.string(input)\n\n const characters = input.match(charRegexMatcher)\n if (characters === null) {\n return input\n }\n\n return characters\n .map(character => which(character, { markdown: true }) ?? character)\n .join('')\n}\n","import { assert } from '@sindresorhus/is'\nimport skinTone from 'skin-tone'\n\nimport { findByCode } from './findByCode.js'\n\nexport interface WhichOptions {\n markdown?: boolean\n}\n\n/**\n * Get an emoji name from an emoji.\n */\nexport const which = (\n emoji: string,\n { markdown = false }: WhichOptions = {},\n) => {\n assert.string(emoji)\n assert.boolean(markdown)\n\n const result = findByCode(skinTone(emoji, 'none'))\n if (result === undefined) {\n return undefined\n }\n\n return markdown ? `:${result.key}:` : result.key\n}\n"],"mappings":"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","names":["import_is","charRegex","emojilib","is","import_is","import_is","import_is","import_is","import_is","is","import_is","import_is","skinTone"]}
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/emojify.ts
4
+ import is from "@sindresorhus/is";
5
+
6
+ // src/findByName.ts
7
+ import { assert } from "@sindresorhus/is";
8
+
9
+ // src/data.ts
10
+ import emojilib from "emojilib";
11
+
12
+ // src/utils.ts
13
+ import charRegex from "char-regex";
14
+ var charRegexMatcher = charRegex();
15
+ function asFunction(input) {
16
+ return typeof input === "function" ? input : () => input;
17
+ }
18
+ var NON_SPACING_MARK = String.fromCharCode(65039);
19
+ var nonSpacingRegex = new RegExp(NON_SPACING_MARK, "g");
20
+ function normalizeCode(code) {
21
+ return code.replace(nonSpacingRegex, "");
22
+ }
23
+ function normalizeName(name) {
24
+ return /:.+:/.test(name) ? name.slice(1, -1) : name;
25
+ }
26
+ function randomItem(array) {
27
+ return array[Math.floor(Math.random() * array.length)];
28
+ }
29
+
30
+ // src/data.ts
31
+ var emojiData = Object.entries(emojilib.lib).map(
32
+ ([name, { char: emoji }]) => [name, emoji]
33
+ );
34
+ var emojiCodesByName = new Map(emojiData);
35
+ var emojiNamesByCode = new Map(
36
+ emojiData.map(([name, emoji]) => [normalizeCode(emoji), name])
37
+ );
38
+
39
+ // src/findByName.ts
40
+ var findByName = (name) => {
41
+ assert.string(name);
42
+ const nameNormalized = normalizeName(name);
43
+ const emoji = emojiCodesByName.get(nameNormalized);
44
+ return emoji ? { emoji, key: nameNormalized } : void 0;
45
+ };
46
+
47
+ // src/emojify.ts
48
+ var emojify = (input, { fallback, format = (name) => name } = {}) => {
49
+ const fallbackFunction = fallback === void 0 ? fallback : asFunction(fallback);
50
+ is.assert.string(input);
51
+ is.assert.any([is.default.undefined, is.default.function_], fallbackFunction);
52
+ is.assert.function_(format);
53
+ return input.replace(/:[\w\-+]+:/g, (part) => {
54
+ const found = findByName(part);
55
+ if (found) {
56
+ return format(found.emoji, part, input);
57
+ }
58
+ if (fallbackFunction) {
59
+ return format(fallbackFunction(normalizeName(part)));
60
+ }
61
+ return format(part);
62
+ });
63
+ };
64
+
65
+ // src/findByCode.ts
66
+ import { assert as assert2 } from "@sindresorhus/is";
67
+ var findByCode = (code) => {
68
+ assert2.string(code);
69
+ const emojiNormalized = normalizeCode(code);
70
+ const key = emojiNamesByCode.get(emojiNormalized);
71
+ return key ? { emoji: emojiNormalized, key } : void 0;
72
+ };
73
+
74
+ // src/find.ts
75
+ var find = (codeOrName) => {
76
+ return findByCode(codeOrName) ?? findByName(codeOrName);
77
+ };
78
+
79
+ // src/get.ts
80
+ import { assert as assert3 } from "@sindresorhus/is";
81
+ var get = (codeOrName) => {
82
+ assert3.string(codeOrName);
83
+ return emojiCodesByName.get(normalizeName(codeOrName));
84
+ };
85
+
86
+ // src/has.ts
87
+ import { assert as assert4 } from "@sindresorhus/is";
88
+ var has = (codeOrName) => {
89
+ assert4.string(codeOrName);
90
+ return emojiCodesByName.has(normalizeName(codeOrName)) || emojiNamesByCode.has(normalizeCode(codeOrName));
91
+ };
92
+
93
+ // src/random.ts
94
+ var random = () => {
95
+ const [name, emoji] = randomItem(emojiData);
96
+ return { emoji, name };
97
+ };
98
+
99
+ // src/replace.ts
100
+ import { assert as assert5 } from "@sindresorhus/is";
101
+
102
+ // src/search.ts
103
+ import is2, { assert as assert6 } from "@sindresorhus/is";
104
+ var search = (keyword) => {
105
+ assert6.any([is2.default.string, is2.default.regExp], keyword);
106
+ if (is2.default.string(keyword)) {
107
+ keyword = normalizeName(keyword);
108
+ }
109
+ if (is2.default.regExp(keyword)) {
110
+ const normalizedPattern = normalizeName(keyword.source);
111
+ keyword = new RegExp(normalizedPattern);
112
+ }
113
+ return emojiData.filter(([name]) => name.match(keyword)).map(([name, emoji]) => ({ emoji, name }));
114
+ };
115
+
116
+ // src/unemojify.ts
117
+ import { assert as assert8 } from "@sindresorhus/is";
118
+
119
+ // src/which.ts
120
+ import { assert as assert7 } from "@sindresorhus/is";
121
+ import skinTone from "skin-tone";
122
+ var which = (emoji, { markdown = false } = {}) => {
123
+ assert7.string(emoji);
124
+ assert7.boolean(markdown);
125
+ const result = findByCode(skinTone(emoji, "none"));
126
+ if (result === void 0) {
127
+ return void 0;
128
+ }
129
+ return markdown ? `:${result.key}:` : result.key;
130
+ };
131
+
132
+ // src/unemojify.ts
133
+ var unemojify = (input) => {
134
+ assert8.string(input);
135
+ const characters = input.match(charRegexMatcher);
136
+ if (characters === null) {
137
+ return input;
138
+ }
139
+ return characters.map((character) => which(character, { markdown: true }) ?? character).join("");
140
+ };
141
+
142
+ // bin/emoji-cli.ts
143
+ function run() {
144
+ console.log("Emoji cli");
145
+ const args = process.argv.slice(2);
146
+ const command = args[0];
147
+ if (!command || command === "--help" || command === "-h") {
148
+ showhelp();
149
+ return;
150
+ }
151
+ switch (command) {
152
+ case "--help":
153
+ case "-h":
154
+ showhelp();
155
+ break;
156
+ case "--search":
157
+ runsearch(args[1]);
158
+ break;
159
+ case "--emojify":
160
+ runemojify(args[1]);
161
+ break;
162
+ case "--unemojify":
163
+ rununemojify(args[1]);
164
+ break;
165
+ case "--get":
166
+ runget(args[1]);
167
+ break;
168
+ case "--has":
169
+ runhas(args[1]);
170
+ break;
171
+ case "--find":
172
+ case "-f":
173
+ runfind(args[1]);
174
+ break;
175
+ case "--random":
176
+ case "--rnd":
177
+ case "-r":
178
+ runrandom();
179
+ break;
180
+ default:
181
+ showhelp();
182
+ break;
183
+ }
184
+ function showhelp() {
185
+ console.log("Help:");
186
+ console.log("Commands: --search --emojify --unemojify --get --has --random --find");
187
+ }
188
+ }
189
+ function runsearch(args) {
190
+ console.log("searching for: ", args);
191
+ search(args);
192
+ console.log(search(args));
193
+ }
194
+ function runemojify(args) {
195
+ console.log(emojify(args));
196
+ }
197
+ function rununemojify(args) {
198
+ console.log(unemojify(args));
199
+ }
200
+ function runget(args) {
201
+ console.log(get(args));
202
+ }
203
+ function runhas(args) {
204
+ console.log(has(args));
205
+ }
206
+ function runfind(args) {
207
+ console.log(find(args));
208
+ }
209
+ function runrandom() {
210
+ console.log(random());
211
+ }
212
+ run();
213
+ export {
214
+ run as default
215
+ };
216
+ //# sourceMappingURL=emoji-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/emojify.ts","../src/findByName.ts","../src/data.ts","../src/utils.ts","../src/findByCode.ts","../src/find.ts","../src/get.ts","../src/has.ts","../src/random.ts","../src/replace.ts","../src/search.ts","../src/unemojify.ts","../src/which.ts","../bin/emoji-cli.ts"],"sourcesContent":["import is from '@sindresorhus/is'\n\nimport { findByName } from './findByName.js'\nimport { asFunction, normalizeName } from './utils.js'\n\nexport type EmojifyFormat = (\n name: string,\n part?: string,\n input?: string,\n) => string\n\nexport interface EmojifyOptions {\n /**\n * The string to fallback to if an emoji was not found.\n */\n fallback?: ((part: string) => string) | string\n\n /**\n * Adds a middleware layer to modify each matched emoji after parsing.\n */\n format?: EmojifyFormat\n}\n\n/**\n * Parse all markdown-encoded emojis in a string.\n */\nexport const emojify = (\n input: string,\n { fallback, format = name => name }: EmojifyOptions = {},\n) => {\n const fallbackFunction =\n fallback === undefined ? fallback : asFunction(fallback)\n\n is.assert.string(input)\n is.assert.any([is.default.undefined, is.default.function_], fallbackFunction)\n is.assert.function_(format)\n\n return input.replace(/:[\\w\\-+]+:/g, part => {\n const found = findByName(part)\n if (found) {\n return format(found.emoji, part, input)\n }\n\n if (fallbackFunction) {\n return format(fallbackFunction(normalizeName(part)))\n }\n\n return format(part)\n })\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiCodesByName } from './data.js'\nimport { normalizeName } from './utils.js'\n\nexport const findByName = (name: string) => {\n assert.string(name)\n\n const nameNormalized = normalizeName(name)\n const emoji = emojiCodesByName.get(nameNormalized)\n\n return emoji ? { emoji, key: nameNormalized } : undefined\n}\n","import emojilib from 'emojilib'\n\nimport { normalizeCode } from './utils.js'\n\nexport interface Emoji {\n emoji: string\n key: string\n}\n\nexport const emojiData = Object.entries(emojilib.lib).map(\n ([name, { char: emoji }]) => [name, emoji] as const,\n)\n\nexport const emojiCodesByName = new Map(emojiData)\n\nexport const emojiNamesByCode = new Map(\n emojiData.map(([name, emoji]) => [normalizeCode(emoji), name]),\n)\n","import charRegex from 'char-regex'\n\nexport const charRegexMatcher = charRegex()\n\nexport function asFunction<T extends PropertyKey, Args extends unknown[]>(\n input: ((...args: Args) => T) | T,\n): (...args: Args) => T {\n return typeof input === 'function' ? input : () => input\n}\n\n/**\n * Non spacing mark contained by some emoticons (65039 - '️' - 0xFE0F).\n *\n * It's the 'Variant Form', which provides more information so that emoticons\n * can be rendered as more colorful graphics. FE0E is a unicode text version\n * whereas FE0F should be rendered as a graphical version.\n * The code gracefully degrades.\n */\nconst NON_SPACING_MARK = String.fromCharCode(65039)\n\nconst nonSpacingRegex = new RegExp(NON_SPACING_MARK, 'g')\n\n/**\n * Removes the non-spacing-mark from the emoji code.\n *\n * Never send a stripped version to clients, as it kills graphical emoticons.\n */\nexport function normalizeCode(code: string) {\n return code.replace(nonSpacingRegex, '')\n}\n\nexport function normalizeName(name: string) {\n return /:.+:/.test(name) ? name.slice(1, -1) : name\n}\n\nexport function randomItem<T>(array: T[]) {\n return array[Math.floor(Math.random() * array.length)]\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiNamesByCode } from './data.js'\nimport { normalizeCode } from './utils.js'\n\nexport const findByCode = (code: string) => {\n assert.string(code)\n\n const emojiNormalized = normalizeCode(code)\n const key = emojiNamesByCode.get(emojiNormalized)\n\n return key ? { emoji: emojiNormalized, key } : undefined\n}\n","import { findByCode } from './findByCode.js'\nimport { findByName } from './findByName.js'\n\n/**\n * Get the name and character of an emoji.\n */\nexport const find = (codeOrName: string) => {\n return findByCode(codeOrName) ?? findByName(codeOrName)\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiCodesByName } from './data.js'\nimport { normalizeName } from './utils.js'\n\n/**\n * Get an emoji from an emoji name.\n */\nexport const get = (codeOrName: string) => {\n assert.string(codeOrName)\n\n return emojiCodesByName.get(normalizeName(codeOrName))\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { emojiCodesByName, emojiNamesByCode } from './data.js'\nimport { normalizeCode, normalizeName } from './utils.js'\n\n/**\n * Check if this library supports a specific emoji.\n */\nexport const has = (codeOrName: string) => {\n assert.string(codeOrName)\n\n return (\n emojiCodesByName.has(normalizeName(codeOrName)) ||\n emojiNamesByCode.has(normalizeCode(codeOrName))\n )\n}\n","import { emojiData } from './data.js'\nimport { randomItem } from './utils.js'\n\n/**\n * Get a random emoji.\n */\nexport const random = () => {\n const [name, emoji] = randomItem(emojiData)\n return { emoji, name }\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { Emoji } from './data.js'\nimport { findByCode } from './findByCode.js'\nimport { asFunction, charRegexMatcher } from './utils.js'\n\nexport type ReplaceReplacement = (\n emoji: Emoji,\n index: number,\n string: string,\n) => string\n\n/**\n * Replace the emojis in a string.\n */\nexport const replace = (\n input: string,\n replacement: ReplaceReplacement | string,\n { preserveSpaces = false } = {},\n) => {\n const replace = asFunction(replacement)\n\n assert.string(input)\n assert.function_(replace)\n assert.boolean(preserveSpaces)\n\n const characters = input.match(charRegexMatcher)\n if (characters === null) {\n return input\n }\n\n return characters\n .map((character, index) => {\n const found = findByCode(character)\n if (!found) {\n return character\n }\n\n if (!preserveSpaces && characters[index + 1] === ' ') {\n characters[index + 1] = ''\n }\n\n return replace(found, index, input)\n })\n .join('')\n}\n","import is, { assert } from '@sindresorhus/is'\n\nimport { emojiData } from './data.js'\nimport { normalizeName } from './utils.js'\n\n/**\n * Search for emojis containing the provided name or pattern in their name.\n */\nexport const search = (keyword: RegExp | string) => {\n assert.any([is.default.string, is.default.regExp], keyword)\n\n if (is.default.string(keyword)) {\n keyword = normalizeName(keyword)\n }\n\n if (is.default.regExp(keyword)) {\n const normalizedPattern = normalizeName(keyword.source)\n keyword = new RegExp(normalizedPattern)\n }\n\n return emojiData\n .filter(([name]) => name.match(keyword))\n .map(([name, emoji]) => ({ emoji, name }))\n}\n","import { assert } from '@sindresorhus/is'\n\nimport { charRegexMatcher } from './utils.js'\nimport { which } from './which.js'\n\n/**\n * Convert all emojis in a string to their markdown-encoded counterparts.\n */\nexport const unemojify = (input: string) => {\n assert.string(input)\n\n const characters = input.match(charRegexMatcher)\n if (characters === null) {\n return input\n }\n\n return characters\n .map(character => which(character, { markdown: true }) ?? character)\n .join('')\n}\n","import { assert } from '@sindresorhus/is'\nimport skinTone from 'skin-tone'\n\nimport { findByCode } from './findByCode.js'\n\nexport interface WhichOptions {\n markdown?: boolean\n}\n\n/**\n * Get an emoji name from an emoji.\n */\nexport const which = (\n emoji: string,\n { markdown = false }: WhichOptions = {},\n) => {\n assert.string(emoji)\n assert.boolean(markdown)\n\n const result = findByCode(skinTone(emoji, 'none'))\n if (result === undefined) {\n return undefined\n }\n\n return markdown ? `:${result.key}:` : result.key\n}\n","#!/usr/bin/env node\n\nimport * as cli from '../src/index.ts'\nexport default function run() {\n console.log('Emoji cli')\n const args = process.argv.slice(2)\n const command = args[0]\n\n if (!command || command === '--help' || command === '-h') {\n showhelp()\n return\n }\n\n switch (command) {\n case '--help':\n case '-h':\n showhelp()\n break;\n case '--search':\n runsearch(args[1]);\n break;\n case '--emojify':\n runemojify(args[1]); \n break; \n case '--unemojify':\n rununemojify(args[1]); \n break;\n case '--get':\n runget(args[1]); \n break; \n case '--has':\n runhas(args[1]); \n break; \n case '--find':\n case '-f': \n runfind(args[1]); \n break; \n case '--random':\n case '--rnd':\n case '-r': \n runrandom(); \n break; \n default:\n showhelp();\n break; \n }\n\n function showhelp() {\n console.log('Help:');\n console.log('Commands: --search --emojify --unemojify --get --has --random --find');\n }\n}\n\nfunction runsearch(args: string){\n console.log(\"searching for: \", args)\n cli.search(args);\n console.log(cli.search(args));\n}\n\nfunction runemojify(args: string){\n console.log(cli.emojify(args));\n}\n\nfunction rununemojify(args: string){\n console.log(cli.unemojify(args));\n}\n\nfunction runget(args: string){\n console.log(cli.get(args));\n}\n\nfunction runhas(args: string){\n console.log(cli.has(args));\n}\n\nfunction runfind(args: string){\n console.log(cli.find(args));\n}\n\nfunction runrandom(){\n console.log(cli.random());\n}\n\n\nrun()\n"],"mappings":"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","names":["assert","assert","assert","assert","assert","assert","assert","is","assert","assert","is","assert","assert","assert","assert"]}
package/package.json ADDED
@@ -0,0 +1,126 @@
1
+ {
2
+ "name": "@involvex/emoji-cli",
3
+ "version": "2.2.2",
4
+ "description": "Friendly emoji lookups and parsing utilities for Node.js. 💖",
5
+ "keywords": [
6
+ "emoji",
7
+ "simple",
8
+ "emoticons",
9
+ "emoticon",
10
+ "emojis",
11
+ "smiley",
12
+ "smileys",
13
+ "smilies",
14
+ "ideogram",
15
+ "ideograms"
16
+ ],
17
+ "bugs": {
18
+ "url": "https://github.com/omnidan/node-emoji/issues"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/omnidan/node-emoji"
23
+ },
24
+ "license": "MIT",
25
+ "author": {
26
+ "name": "Involvex"
27
+ },
28
+ "type": "module",
29
+ "exports": {
30
+ ".": {
31
+ "types": {
32
+ "import": "./lib/index.d.ts",
33
+ "require": "./lib/index.d.cts"
34
+ },
35
+ "import": "./lib/index.js",
36
+ "require": "./lib/index.cjs"
37
+ }
38
+ },
39
+ "main": "./lib/index.js",
40
+ "bin": {
41
+ "emoji-cli": "bin/emoji-cli-improved.ts"
42
+ },
43
+ "files": [
44
+ "lib/",
45
+ "package.json",
46
+ "LICENSE.md",
47
+ "README.md",
48
+ "bin/emoji-cli.ts",
49
+ "src/*"
50
+ ],
51
+ "scripts": {
52
+ "build": "tsup",
53
+ "build:cli": "bun build --target=node bin/emoji-cli-improved.ts --outdir=dist",
54
+ "dev": "bun run bin/emoji-cli-improved.ts",
55
+ "format": "prettier . --write",
56
+ "lint": "eslint . .*js --max-warnings 0 -c eslint.config.ts",
57
+ "lint:knip": "knip",
58
+ "lint:md": "markdownlint \"**/*.md\" \".github/**/*.md\" --rules sentences-per-line",
59
+ "lint:package-json": "npmPkgJsonLint .",
60
+ "lint:packages": "pnpm dedupe --check",
61
+ "lint:spelling": "cspell \"**\" \".github/**/*\"",
62
+ "prepare": "husky install",
63
+ "should-semantic-release": "should-semantic-release --verbose",
64
+ "start": "node dist/emoji-cli.js",
65
+ "test": "vitest",
66
+ "test:cjs": "node ./src/e2e.cjs",
67
+ "tsc": "tsc"
68
+ },
69
+ "lint-staged": {
70
+ "*": "prettier --ignore-unknown --write"
71
+ },
72
+ "dependencies": {
73
+ "@sindresorhus/is": "^4.6.0",
74
+ "char-regex": "^1.0.2",
75
+ "emojilib": "^2.4.0",
76
+ "jiti": "^2.6.1",
77
+ "skin-tone": "^2.0.0"
78
+ },
79
+ "devDependencies": {
80
+ "@eslint/js": "^9.39.2",
81
+ "@eslint/json": "^0.14.0",
82
+ "@release-it/conventional-changelog": "^10.0.0",
83
+ "@swc/core": "^1.3.58",
84
+ "@types/eslint": "^8.44.7",
85
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
86
+ "@typescript-eslint/parser": "^8.0.0",
87
+ "@vitest/coverage-v8": "^0.34.6",
88
+ "console-fail-test": "^0.5.0",
89
+ "cspell": "^8.0.0",
90
+ "eslint": "^9.39.2",
91
+ "eslint-plugin-deprecation": "^3.0.0",
92
+ "eslint-plugin-eslint-comments": "^3.2.0",
93
+ "eslint-plugin-jsdoc": "^50.0.0",
94
+ "eslint-plugin-jsonc": "^2.10.0",
95
+ "eslint-plugin-markdown": "^3.0.1",
96
+ "eslint-plugin-n": "^17.0.0",
97
+ "eslint-plugin-no-only-tests": "^3.1.0",
98
+ "eslint-plugin-perfectionist": "^2.3.0",
99
+ "eslint-plugin-regexp": "^2.1.1",
100
+ "eslint-plugin-vitest": "^0.3.9",
101
+ "eslint-plugin-yml": "^1.10.0",
102
+ "globals": "^16.5.0",
103
+ "husky": "^8.0.3",
104
+ "jsonc-eslint-parser": "^2.4.0",
105
+ "knip": "^4.0.0",
106
+ "lint-staged": "^15.1.0",
107
+ "markdownlint": "^0.37.0",
108
+ "markdownlint-cli": "^0.44.0",
109
+ "npm-package-json-lint": "^8.0.0",
110
+ "npm-package-json-lint-config-default": "^7.0.0",
111
+ "prettier": "^3.0.3",
112
+ "prettier-plugin-curly": "^0.3.0",
113
+ "prettier-plugin-packagejson": "^2.4.6",
114
+ "release-it": "^18.0.0",
115
+ "sentences-per-line": "^0.3.0",
116
+ "should-semantic-release": "^0.2.1",
117
+ "tsup": "^8.0.0",
118
+ "typescript": "^5.2.2",
119
+ "typescript-eslint": "^8.50.1",
120
+ "vitest": "^0.34.6",
121
+ "yaml-eslint-parser": "^1.2.2"
122
+ },
123
+ "engines": {
124
+ "node": ">=18"
125
+ }
126
+ }
package/src/data.ts ADDED
@@ -0,0 +1,18 @@
1
+ import emojilib from 'emojilib'
2
+
3
+ import { normalizeCode } from './utils.js'
4
+
5
+ export interface Emoji {
6
+ emoji: string
7
+ key: string
8
+ }
9
+
10
+ export const emojiData = Object.entries(emojilib.lib).map(
11
+ ([name, { char: emoji }]) => [name, emoji] as const,
12
+ )
13
+
14
+ export const emojiCodesByName = new Map(emojiData)
15
+
16
+ export const emojiNamesByCode = new Map(
17
+ emojiData.map(([name, emoji]) => [normalizeCode(emoji), name]),
18
+ )
package/src/e2e.cjs ADDED
@@ -0,0 +1,5 @@
1
+ const { strict: assert } = require('node:assert')
2
+
3
+ const emoji = require('../lib/index.cjs')
4
+
5
+ assert.equal(emoji.emojify(':wave:'), '👋')