@involvex/emoji-cli 2.2.4 → 2.2.5

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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import * as cli from '../src/index.js'
3
+ import * as cli from '../lib/index.js'
4
4
 
5
5
  // Type definitions for better type safety
6
6
  interface CLIConfig {
@@ -27,7 +27,7 @@ interface ParsedArgs {
27
27
  const CONFIG: CLIConfig = {
28
28
  name: 'emoji-cli',
29
29
  description: 'Friendly emoji lookups and parsing utilities for Node.js',
30
- version: await import('../package.json').then(pkg => pkg.default.version),
30
+ version: '2.2.3', // TODO: Get version from package.json dynamically
31
31
  }
32
32
 
33
33
  // Available commands
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  "use strict";
3
2
  var __create = Object.create;
4
3
  var __defProp = Object.defineProperty;
@@ -28,12 +27,21 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
27
  ));
29
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
29
 
31
- // bin/emoji-cli.ts
32
- var emoji_cli_exports = {};
33
- __export(emoji_cli_exports, {
34
- default: () => run
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ emojify: () => emojify,
34
+ find: () => find,
35
+ get: () => get,
36
+ has: () => has,
37
+ random: () => random,
38
+ replace: () => replace,
39
+ search: () => search,
40
+ strip: () => strip,
41
+ unemojify: () => unemojify,
42
+ which: () => which
35
43
  });
36
- module.exports = __toCommonJS(emoji_cli_exports);
44
+ module.exports = __toCommonJS(index_exports);
37
45
 
38
46
  // src/emojify.ts
39
47
  var import_is2 = __toESM(require("@sindresorhus/is"), 1);
@@ -133,6 +141,26 @@ var random = () => {
133
141
 
134
142
  // src/replace.ts
135
143
  var import_is6 = require("@sindresorhus/is");
144
+ var replace = (input, replacement, { preserveSpaces = false } = {}) => {
145
+ const replace2 = asFunction(replacement);
146
+ import_is6.assert.string(input);
147
+ import_is6.assert.function_(replace2);
148
+ import_is6.assert.boolean(preserveSpaces);
149
+ const characters = input.match(charRegexMatcher);
150
+ if (characters === null) {
151
+ return input;
152
+ }
153
+ return characters.map((character, index) => {
154
+ const found = findByCode(character);
155
+ if (!found) {
156
+ return character;
157
+ }
158
+ if (!preserveSpaces && characters[index + 1] === " ") {
159
+ characters[index + 1] = "";
160
+ }
161
+ return replace2(found, index, input);
162
+ }).join("");
163
+ };
136
164
 
137
165
  // src/search.ts
138
166
  var import_is7 = __toESM(require("@sindresorhus/is"), 1);
@@ -148,6 +176,9 @@ var search = (keyword) => {
148
176
  return emojiData.filter(([name]) => name.match(keyword)).map(([name, emoji]) => ({ emoji, name }));
149
177
  };
150
178
 
179
+ // src/strip.ts
180
+ var strip = (input, { preserveSpaces } = {}) => replace(input, "", { preserveSpaces });
181
+
151
182
  // src/unemojify.ts
152
183
  var import_is9 = require("@sindresorhus/is");
153
184
 
@@ -173,76 +204,17 @@ var unemojify = (input) => {
173
204
  }
174
205
  return characters.map((character) => which(character, { markdown: true }) ?? character).join("");
175
206
  };
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
207
+ // Annotate the CommonJS export names for ESM import in node:
208
+ 0 && (module.exports = {
209
+ emojify,
210
+ find,
211
+ get,
212
+ has,
213
+ random,
214
+ replace,
215
+ search,
216
+ strip,
217
+ unemojify,
218
+ which
219
+ });
220
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.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/strip.ts","../src/unemojify.ts","../src/which.ts"],"sourcesContent":["export * from './emojify.js'\nexport * from './find.js'\nexport * from './get.js'\nexport * from './has.js'\nexport * from './random.js'\nexport * from './replace.js'\nexport * from './search.js'\nexport * from './strip.js'\nexport * from './unemojify.js'\nexport * from './which.js'\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 { replace } from './replace.js'\n\nexport interface StripOptions {\n /**\n * Whether to keep the extra space after a stripped emoji.\n */\n preserveSpaces?: boolean\n}\n\n/**\n * Remove all the emojis from a string.\n */\nexport const strip = (input: string, { preserveSpaces }: StripOptions = {}) =>\n replace(input, '', { preserveSpaces })\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,aAAe;;;ACAf,gBAAuB;;;ACAvB,sBAAqB;;;ACArB,wBAAsB;AAEf,IAAM,uBAAmB,kBAAAC,SAAU;AAEnC,SAAS,WACd,OACsB;AACtB,SAAO,OAAO,UAAU,aAAa,QAAQ,MAAM;AACrD;AAUA,IAAM,mBAAmB,OAAO,aAAa,KAAK;AAElD,IAAM,kBAAkB,IAAI,OAAO,kBAAkB,GAAG;AAOjD,SAAS,cAAc,MAAc;AAC1C,SAAO,KAAK,QAAQ,iBAAiB,EAAE;AACzC;AAEO,SAAS,cAAc,MAAc;AAC1C,SAAO,OAAO,KAAK,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AACjD;AAEO,SAAS,WAAc,OAAY;AACxC,SAAO,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AACvD;;;AD5BO,IAAM,YAAY,OAAO,QAAQ,gBAAAC,QAAS,GAAG,EAAE;AAAA,EACpD,CAAC,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK;AAC3C;AAEO,IAAM,mBAAmB,IAAI,IAAI,SAAS;AAE1C,IAAM,mBAAmB,IAAI;AAAA,EAClC,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,cAAc,KAAK,GAAG,IAAI,CAAC;AAC/D;;;ADZO,IAAM,aAAa,CAAC,SAAiB;AAC1C,mBAAO,OAAO,IAAI;AAElB,QAAM,iBAAiB,cAAc,IAAI;AACzC,QAAM,QAAQ,iBAAiB,IAAI,cAAc;AAEjD,SAAO,QAAQ,EAAE,OAAO,KAAK,eAAe,IAAI;AAClD;;;ADcO,IAAM,UAAU,CACrB,OACA,EAAE,UAAU,SAAS,UAAQ,KAAK,IAAoB,CAAC,MACpD;AACH,QAAM,mBACJ,aAAa,SAAY,WAAW,WAAW,QAAQ;AAEzD,aAAAC,QAAG,OAAO,OAAO,KAAK;AACtB,aAAAA,QAAG,OAAO,IAAI,CAAC,WAAAA,QAAG,QAAQ,WAAW,WAAAA,QAAG,QAAQ,SAAS,GAAG,gBAAgB;AAC5E,aAAAA,QAAG,OAAO,UAAU,MAAM;AAE1B,SAAO,MAAM,QAAQ,eAAe,UAAQ;AAC1C,UAAM,QAAQ,WAAW,IAAI;AAC7B,QAAI,OAAO;AACT,aAAO,OAAO,MAAM,OAAO,MAAM,KAAK;AAAA,IACxC;AAEA,QAAI,kBAAkB;AACpB,aAAO,OAAO,iBAAiB,cAAc,IAAI,CAAC,CAAC;AAAA,IACrD;AAEA,WAAO,OAAO,IAAI;AAAA,EACpB,CAAC;AACH;;;AIjDA,IAAAC,aAAuB;AAKhB,IAAM,aAAa,CAAC,SAAiB;AAC1C,oBAAO,OAAO,IAAI;AAElB,QAAM,kBAAkB,cAAc,IAAI;AAC1C,QAAM,MAAM,iBAAiB,IAAI,eAAe;AAEhD,SAAO,MAAM,EAAE,OAAO,iBAAiB,IAAI,IAAI;AACjD;;;ACNO,IAAM,OAAO,CAAC,eAAuB;AAC1C,SAAO,WAAW,UAAU,KAAK,WAAW,UAAU;AACxD;;;ACRA,IAAAC,aAAuB;AAQhB,IAAM,MAAM,CAAC,eAAuB;AACzC,oBAAO,OAAO,UAAU;AAExB,SAAO,iBAAiB,IAAI,cAAc,UAAU,CAAC;AACvD;;;ACZA,IAAAC,aAAuB;AAQhB,IAAM,MAAM,CAAC,eAAuB;AACzC,oBAAO,OAAO,UAAU;AAExB,SACE,iBAAiB,IAAI,cAAc,UAAU,CAAC,KAC9C,iBAAiB,IAAI,cAAc,UAAU,CAAC;AAElD;;;ACTO,IAAM,SAAS,MAAM;AAC1B,QAAM,CAAC,MAAM,KAAK,IAAI,WAAW,SAAS;AAC1C,SAAO,EAAE,OAAO,KAAK;AACvB;;;ACTA,IAAAC,aAAuB;AAehB,IAAM,UAAU,CACrB,OACA,aACA,EAAE,iBAAiB,MAAM,IAAI,CAAC,MAC3B;AACH,QAAMC,WAAU,WAAW,WAAW;AAEtC,oBAAO,OAAO,KAAK;AACnB,oBAAO,UAAUA,QAAO;AACxB,oBAAO,QAAQ,cAAc;AAE7B,QAAM,aAAa,MAAM,MAAM,gBAAgB;AAC/C,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,WACJ,IAAI,CAAC,WAAW,UAAU;AACzB,UAAM,QAAQ,WAAW,SAAS;AAClC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,kBAAkB,WAAW,QAAQ,CAAC,MAAM,KAAK;AACpD,iBAAW,QAAQ,CAAC,IAAI;AAAA,IAC1B;AAEA,WAAOA,SAAQ,OAAO,OAAO,KAAK;AAAA,EACpC,CAAC,EACA,KAAK,EAAE;AACZ;;;AC7CA,IAAAC,aAA2B;AAQpB,IAAM,SAAS,CAAC,YAA6B;AAClD,oBAAO,IAAI,CAAC,WAAAC,QAAG,QAAQ,QAAQ,WAAAA,QAAG,QAAQ,MAAM,GAAG,OAAO;AAE1D,MAAI,WAAAA,QAAG,QAAQ,OAAO,OAAO,GAAG;AAC9B,cAAU,cAAc,OAAO;AAAA,EACjC;AAEA,MAAI,WAAAA,QAAG,QAAQ,OAAO,OAAO,GAAG;AAC9B,UAAM,oBAAoB,cAAc,QAAQ,MAAM;AACtD,cAAU,IAAI,OAAO,iBAAiB;AAAA,EACxC;AAEA,SAAO,UACJ,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,OAAO,CAAC,EACtC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,OAAO,KAAK,EAAE;AAC7C;;;ACXO,IAAM,QAAQ,CAAC,OAAe,EAAE,eAAe,IAAkB,CAAC,MACvE,QAAQ,OAAO,IAAI,EAAE,eAAe,CAAC;;;ACbvC,IAAAC,aAAuB;;;ACAvB,IAAAC,aAAuB;AACvB,uBAAqB;AAWd,IAAM,QAAQ,CACnB,OACA,EAAE,WAAW,MAAM,IAAkB,CAAC,MACnC;AACH,oBAAO,OAAO,KAAK;AACnB,oBAAO,QAAQ,QAAQ;AAEvB,QAAM,SAAS,eAAW,iBAAAC,SAAS,OAAO,MAAM,CAAC;AACjD,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,IAAI,OAAO,GAAG,MAAM,OAAO;AAC/C;;;ADjBO,IAAM,YAAY,CAAC,UAAkB;AAC1C,oBAAO,OAAO,KAAK;AAEnB,QAAM,aAAa,MAAM,MAAM,gBAAgB;AAC/C,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,WACJ,IAAI,eAAa,MAAM,WAAW,EAAE,UAAU,KAAK,CAAC,KAAK,SAAS,EAClE,KAAK,EAAE;AACZ;","names":["import_is","charRegex","emojilib","is","import_is","import_is","import_is","import_is","replace","import_is","is","import_is","import_is","skinTone"]}
@@ -0,0 +1,88 @@
1
+ type EmojifyFormat = (name: string, part?: string, input?: string) => string;
2
+ interface EmojifyOptions {
3
+ /**
4
+ * The string to fallback to if an emoji was not found.
5
+ */
6
+ fallback?: ((part: string) => string) | string;
7
+ /**
8
+ * Adds a middleware layer to modify each matched emoji after parsing.
9
+ */
10
+ format?: EmojifyFormat;
11
+ }
12
+ /**
13
+ * Parse all markdown-encoded emojis in a string.
14
+ */
15
+ declare const emojify: (input: string, { fallback, format }?: EmojifyOptions) => string;
16
+
17
+ /**
18
+ * Get the name and character of an emoji.
19
+ */
20
+ declare const find: (codeOrName: string) => {
21
+ emoji: string;
22
+ key: string;
23
+ } | undefined;
24
+
25
+ /**
26
+ * Get an emoji from an emoji name.
27
+ */
28
+ declare const get: (codeOrName: string) => string | undefined;
29
+
30
+ /**
31
+ * Check if this library supports a specific emoji.
32
+ */
33
+ declare const has: (codeOrName: string) => boolean;
34
+
35
+ /**
36
+ * Get a random emoji.
37
+ */
38
+ declare const random: () => {
39
+ emoji: string;
40
+ name: string;
41
+ };
42
+
43
+ interface Emoji {
44
+ emoji: string;
45
+ key: string;
46
+ }
47
+
48
+ type ReplaceReplacement = (emoji: Emoji, index: number, string: string) => string;
49
+ /**
50
+ * Replace the emojis in a string.
51
+ */
52
+ declare const replace: (input: string, replacement: ReplaceReplacement | string, { preserveSpaces }?: {
53
+ preserveSpaces?: boolean | undefined;
54
+ }) => string;
55
+
56
+ /**
57
+ * Search for emojis containing the provided name or pattern in their name.
58
+ */
59
+ declare const search: (keyword: RegExp | string) => {
60
+ emoji: string;
61
+ name: string;
62
+ }[];
63
+
64
+ interface StripOptions {
65
+ /**
66
+ * Whether to keep the extra space after a stripped emoji.
67
+ */
68
+ preserveSpaces?: boolean;
69
+ }
70
+ /**
71
+ * Remove all the emojis from a string.
72
+ */
73
+ declare const strip: (input: string, { preserveSpaces }?: StripOptions) => string;
74
+
75
+ /**
76
+ * Convert all emojis in a string to their markdown-encoded counterparts.
77
+ */
78
+ declare const unemojify: (input: string) => string;
79
+
80
+ interface WhichOptions {
81
+ markdown?: boolean;
82
+ }
83
+ /**
84
+ * Get an emoji name from an emoji.
85
+ */
86
+ declare const which: (emoji: string, { markdown }?: WhichOptions) => string | undefined;
87
+
88
+ export { type EmojifyFormat, type EmojifyOptions, type ReplaceReplacement, type StripOptions, type WhichOptions, emojify, find, get, has, random, replace, search, strip, unemojify, which };
package/lib/index.d.ts ADDED
@@ -0,0 +1,88 @@
1
+ type EmojifyFormat = (name: string, part?: string, input?: string) => string;
2
+ interface EmojifyOptions {
3
+ /**
4
+ * The string to fallback to if an emoji was not found.
5
+ */
6
+ fallback?: ((part: string) => string) | string;
7
+ /**
8
+ * Adds a middleware layer to modify each matched emoji after parsing.
9
+ */
10
+ format?: EmojifyFormat;
11
+ }
12
+ /**
13
+ * Parse all markdown-encoded emojis in a string.
14
+ */
15
+ declare const emojify: (input: string, { fallback, format }?: EmojifyOptions) => string;
16
+
17
+ /**
18
+ * Get the name and character of an emoji.
19
+ */
20
+ declare const find: (codeOrName: string) => {
21
+ emoji: string;
22
+ key: string;
23
+ } | undefined;
24
+
25
+ /**
26
+ * Get an emoji from an emoji name.
27
+ */
28
+ declare const get: (codeOrName: string) => string | undefined;
29
+
30
+ /**
31
+ * Check if this library supports a specific emoji.
32
+ */
33
+ declare const has: (codeOrName: string) => boolean;
34
+
35
+ /**
36
+ * Get a random emoji.
37
+ */
38
+ declare const random: () => {
39
+ emoji: string;
40
+ name: string;
41
+ };
42
+
43
+ interface Emoji {
44
+ emoji: string;
45
+ key: string;
46
+ }
47
+
48
+ type ReplaceReplacement = (emoji: Emoji, index: number, string: string) => string;
49
+ /**
50
+ * Replace the emojis in a string.
51
+ */
52
+ declare const replace: (input: string, replacement: ReplaceReplacement | string, { preserveSpaces }?: {
53
+ preserveSpaces?: boolean | undefined;
54
+ }) => string;
55
+
56
+ /**
57
+ * Search for emojis containing the provided name or pattern in their name.
58
+ */
59
+ declare const search: (keyword: RegExp | string) => {
60
+ emoji: string;
61
+ name: string;
62
+ }[];
63
+
64
+ interface StripOptions {
65
+ /**
66
+ * Whether to keep the extra space after a stripped emoji.
67
+ */
68
+ preserveSpaces?: boolean;
69
+ }
70
+ /**
71
+ * Remove all the emojis from a string.
72
+ */
73
+ declare const strip: (input: string, { preserveSpaces }?: StripOptions) => string;
74
+
75
+ /**
76
+ * Convert all emojis in a string to their markdown-encoded counterparts.
77
+ */
78
+ declare const unemojify: (input: string) => string;
79
+
80
+ interface WhichOptions {
81
+ markdown?: boolean;
82
+ }
83
+ /**
84
+ * Get an emoji name from an emoji.
85
+ */
86
+ declare const which: (emoji: string, { markdown }?: WhichOptions) => string | undefined;
87
+
88
+ export { type EmojifyFormat, type EmojifyOptions, type ReplaceReplacement, type StripOptions, type WhichOptions, emojify, find, get, has, random, replace, search, strip, unemojify, which };
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env node
2
-
3
1
  // src/emojify.ts
4
2
  import is from "@sindresorhus/is";
5
3
 
@@ -98,6 +96,26 @@ var random = () => {
98
96
 
99
97
  // src/replace.ts
100
98
  import { assert as assert5 } from "@sindresorhus/is";
99
+ var replace = (input, replacement, { preserveSpaces = false } = {}) => {
100
+ const replace2 = asFunction(replacement);
101
+ assert5.string(input);
102
+ assert5.function_(replace2);
103
+ assert5.boolean(preserveSpaces);
104
+ const characters = input.match(charRegexMatcher);
105
+ if (characters === null) {
106
+ return input;
107
+ }
108
+ return characters.map((character, index) => {
109
+ const found = findByCode(character);
110
+ if (!found) {
111
+ return character;
112
+ }
113
+ if (!preserveSpaces && characters[index + 1] === " ") {
114
+ characters[index + 1] = "";
115
+ }
116
+ return replace2(found, index, input);
117
+ }).join("");
118
+ };
101
119
 
102
120
  // src/search.ts
103
121
  import is2, { assert as assert6 } from "@sindresorhus/is";
@@ -113,6 +131,9 @@ var search = (keyword) => {
113
131
  return emojiData.filter(([name]) => name.match(keyword)).map(([name, emoji]) => ({ emoji, name }));
114
132
  };
115
133
 
134
+ // src/strip.ts
135
+ var strip = (input, { preserveSpaces } = {}) => replace(input, "", { preserveSpaces });
136
+
116
137
  // src/unemojify.ts
117
138
  import { assert as assert8 } from "@sindresorhus/is";
118
139
 
@@ -138,79 +159,16 @@ var unemojify = (input) => {
138
159
  }
139
160
  return characters.map((character) => which(character, { markdown: true }) ?? character).join("");
140
161
  };
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
162
  export {
214
- run as default
163
+ emojify,
164
+ find,
165
+ get,
166
+ has,
167
+ random,
168
+ replace,
169
+ search,
170
+ strip,
171
+ unemojify,
172
+ which
215
173
  };
216
- //# sourceMappingURL=emoji-cli.js.map
174
+ //# sourceMappingURL=index.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/strip.ts","../src/unemojify.ts","../src/which.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 { replace } from './replace.js'\n\nexport interface StripOptions {\n /**\n * Whether to keep the extra space after a stripped emoji.\n */\n preserveSpaces?: boolean\n}\n\n/**\n * Remove all the emojis from a string.\n */\nexport const strip = (input: string, { preserveSpaces }: StripOptions = {}) =>\n replace(input, '', { preserveSpaces })\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":["assert","assert","assert","assert","assert","assert","assert","replace","assert","is","assert","assert","is","assert","assert","assert","assert"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@involvex/emoji-cli",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
4
4
  "description": "Friendly emoji lookups and parsing utilities for Node.js. 💖",
5
5
  "keywords": [
6
6
  "emoji",
@@ -53,7 +53,7 @@
53
53
  "build:cli": "bun build --target=node bin/emoji-cli-improved.ts --outdir=dist",
54
54
  "dev": "bun run bin/emoji-cli-improved.ts",
55
55
  "format": "prettier . --write",
56
- "lint": "eslint . -c eslint.config.ts",
56
+ "lint": "eslint . --ignore-pattern lib --ignore-pattern dist -c eslint.config.ts",
57
57
  "lint:knip": "knip",
58
58
  "lint:md": "markdownlint \"**/*.md\" \".github/**/*.md\" --rules sentences-per-line",
59
59
  "lint:package-json": "npmPkgJsonLint .",
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}