@utilix-tech/sdk 0.34.0 → 0.36.0
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.
- package/CHANGELOG.md +7 -0
- package/README.md +19 -6
- package/dist/{chunk-ZPQOE7KD.js → chunk-7AJRK57W.js} +29 -1
- package/dist/{chunk-H2USEUHD.js → chunk-F2CEN226.js} +306 -1
- package/dist/{chunk-3YUKLV5N.js → chunk-UTHAHRQ7.js} +70 -1
- package/dist/index.cjs +402 -0
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/{network-DfY5Ikvr.d.ts → network-X0EfH9Xq.d.cts} +44 -2
- package/dist/{network-DfY5Ikvr.d.cts → network-X0EfH9Xq.d.ts} +44 -2
- package/dist/{text-CA-zuD0C.d.cts → text-kHkT9VtT.d.cts} +34 -2
- package/dist/{text-CA-zuD0C.d.ts → text-kHkT9VtT.d.ts} +34 -2
- package/dist/tools/network.cjs +69 -0
- package/dist/tools/network.d.cts +1 -1
- package/dist/tools/network.d.ts +1 -1
- package/dist/tools/network.js +1 -1
- package/dist/tools/text.cjs +305 -0
- package/dist/tools/text.d.cts +1 -1
- package/dist/tools/text.d.ts +1 -1
- package/dist/tools/text.js +1 -1
- package/dist/tools/units.cjs +28 -0
- package/dist/tools/units.d.cts +1 -1
- package/dist/tools/units.d.ts +1 -1
- package/dist/tools/units.js +1 -1
- package/dist/{units-BhoxdHhs.d.ts → units-c90DW-OZ.d.cts} +30 -2
- package/dist/{units-BhoxdHhs.d.cts → units-c90DW-OZ.d.ts} +30 -2
- package/package.json +1 -1
|
@@ -5,11 +5,13 @@ var network_exports = {};
|
|
|
5
5
|
__export(network_exports, {
|
|
6
6
|
DNS_RECORD_TYPES: () => DNS_RECORD_TYPES,
|
|
7
7
|
HTTP_HEADERS: () => HTTP_HEADERS,
|
|
8
|
+
LINK_REL_VALUES: () => LINK_REL_VALUES,
|
|
8
9
|
REFERRER_POLICY_VALUES: () => REFERRER_POLICY_VALUES,
|
|
9
10
|
STATUS_CODES: () => STATUS_CODES,
|
|
10
11
|
buildCacheControl: () => buildCacheControl,
|
|
11
12
|
buildDnsQueryUrl: () => buildDnsQueryUrl,
|
|
12
13
|
buildGeoUrl: () => buildGeoUrl,
|
|
14
|
+
buildLinkHeader: () => buildLinkHeader,
|
|
13
15
|
buildMapUrl: () => buildMapUrl,
|
|
14
16
|
buildReferrerPolicy: () => buildReferrerPolicy,
|
|
15
17
|
countryCodeToFlag: () => countryCodeToFlag,
|
|
@@ -1895,6 +1897,73 @@ function buildReferrerPolicy(policies) {
|
|
|
1895
1897
|
const metaTag = `<meta name="referrer" content="${last.value}">`;
|
|
1896
1898
|
return { header, headerName: "Referrer-Policy", snippet, metaTag, policies: entries, warnings };
|
|
1897
1899
|
}
|
|
1900
|
+
var LINK_REL_VALUES = [
|
|
1901
|
+
"preload",
|
|
1902
|
+
"preconnect",
|
|
1903
|
+
"prefetch",
|
|
1904
|
+
"prerender",
|
|
1905
|
+
"dns-prefetch",
|
|
1906
|
+
"canonical",
|
|
1907
|
+
"next",
|
|
1908
|
+
"prev",
|
|
1909
|
+
"alternate",
|
|
1910
|
+
"stylesheet",
|
|
1911
|
+
"icon",
|
|
1912
|
+
"modulepreload"
|
|
1913
|
+
];
|
|
1914
|
+
var _LINK_REL_INFO = {
|
|
1915
|
+
preload: "Tells the browser to fetch this resource early, before the parser would otherwise discover it, without blocking rendering. Requires an `as` attribute so the browser applies the right request priority and Content-Security-Policy check; omitting it commonly causes the resource to be fetched twice.",
|
|
1916
|
+
preconnect: "Tells the browser to start the connection handshake (DNS, TCP, TLS) to this origin early, before any real request to it is made, so the first actual request lands faster.",
|
|
1917
|
+
prefetch: "Tells the browser to fetch this resource at low priority for a likely future navigation and cache it. Unlike preload, it does not affect the current page load.",
|
|
1918
|
+
prerender: "Tells the browser to fetch and render this page in the background so navigating to it feels instant, at a real bandwidth and CPU cost if the user never navigates there.",
|
|
1919
|
+
"dns-prefetch": "Tells the browser to resolve this origin's DNS early, a lighter-weight version of preconnect that skips the TCP/TLS handshake.",
|
|
1920
|
+
canonical: "Tells search engines which URL is the authoritative version of this page, used to consolidate duplicate-content signals across query-string or protocol variants.",
|
|
1921
|
+
next: "Marks the next page in a paginated sequence, a hint search engines and some browsers use for pagination.",
|
|
1922
|
+
prev: "Marks the previous page in a paginated sequence.",
|
|
1923
|
+
alternate: "Points to an alternate version of this resource, such as a different language or an RSS feed.",
|
|
1924
|
+
stylesheet: 'Loads an external stylesheet, the same effect as a `<link rel="stylesheet">` tag but delivered as a response header instead.',
|
|
1925
|
+
icon: 'Points to this resource\'s favicon, the same effect as a `<link rel="icon">` tag but delivered as a response header instead.',
|
|
1926
|
+
modulepreload: "Tells the browser to fetch and parse this JavaScript module early, ahead of when the module graph would otherwise discover it."
|
|
1927
|
+
};
|
|
1928
|
+
function buildLinkHeader(links) {
|
|
1929
|
+
if (!Array.isArray(links) || links.length === 0) {
|
|
1930
|
+
return { error: "At least one link entry is required" };
|
|
1931
|
+
}
|
|
1932
|
+
const entries = [];
|
|
1933
|
+
for (const link of links) {
|
|
1934
|
+
const url = typeof link.url === "string" ? link.url.trim() : "";
|
|
1935
|
+
const rel = typeof link.rel === "string" ? link.rel.trim() : "";
|
|
1936
|
+
if (!url) return { error: "Each link entry requires a non-empty url" };
|
|
1937
|
+
if (!rel) return { error: "Each link entry requires a non-empty rel" };
|
|
1938
|
+
if (!LINK_REL_VALUES.includes(rel)) {
|
|
1939
|
+
return { error: `'${rel}' is not a supported rel value. Supported values: ${LINK_REL_VALUES.join(", ")}` };
|
|
1940
|
+
}
|
|
1941
|
+
const as = link.as?.trim() || void 0;
|
|
1942
|
+
const type = link.type?.trim() || void 0;
|
|
1943
|
+
const crossorigin = link.crossorigin === true;
|
|
1944
|
+
let value = `<${url}>; rel="${rel}"`;
|
|
1945
|
+
if (as) value += `; as="${as}"`;
|
|
1946
|
+
if (type) value += `; type="${type}"`;
|
|
1947
|
+
if (crossorigin) value += "; crossorigin";
|
|
1948
|
+
entries.push({ url, rel, as, type, crossorigin: crossorigin || void 0, value, explanation: _LINK_REL_INFO[rel] });
|
|
1949
|
+
}
|
|
1950
|
+
const warnings = [];
|
|
1951
|
+
for (const entry of entries) {
|
|
1952
|
+
if (entry.rel === "preload" && !entry.as) {
|
|
1953
|
+
warnings.push(`preload link for "${entry.url}" is missing an \`as\` attribute \u2014 the browser may fetch it twice or apply the wrong request priority.`);
|
|
1954
|
+
}
|
|
1955
|
+
if ((entry.rel === "preconnect" || entry.rel === "dns-prefetch") && (entry.as || entry.type)) {
|
|
1956
|
+
warnings.push(`${entry.rel} link for "${entry.url}" sets \`as\`/\`type\`, which it ignores since no specific resource is being fetched yet.`);
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
const canonicalCount = entries.filter((e) => e.rel === "canonical").length;
|
|
1960
|
+
if (canonicalCount > 1) {
|
|
1961
|
+
warnings.push(`${canonicalCount} canonical links present \u2014 only one canonical URL should be declared per page.`);
|
|
1962
|
+
}
|
|
1963
|
+
const header = entries.map((e) => e.value).join(", ");
|
|
1964
|
+
const snippet = `Link: ${header}`;
|
|
1965
|
+
return { header, headerName: "Link", snippet, links: entries, warnings };
|
|
1966
|
+
}
|
|
1898
1967
|
function isValidIpv6HexGroup(g) {
|
|
1899
1968
|
return /^[0-9a-fA-F]{1,4}$/.test(g);
|
|
1900
1969
|
}
|
|
@@ -1984,4 +2053,4 @@ function parseIpv6Address(input) {
|
|
|
1984
2053
|
};
|
|
1985
2054
|
}
|
|
1986
2055
|
|
|
1987
|
-
export { DNS_RECORD_TYPES, HTTP_HEADERS, REFERRER_POLICY_VALUES, STATUS_CODES, buildCacheControl, buildDnsQueryUrl, buildGeoUrl, buildMapUrl, buildReferrerPolicy, countryCodeToFlag, formatCoordinates, formatTtl, getByCategory, getHeader, getHeadersByCategory, getStatusByCategory, getStatusCode, isClientError, isServerError, isSuccess, isValidIp, isValidIpv4, isValidIpv6, network_exports, parseDnsResponse, parseGeoResponse, parseHar, parseIpv6Address, parseUserAgent, searchHeaders, searchStatusCodes, statusCodeToText, typeNumberToLabel, validateDomain, validateHeaderName, validateHeaderValue, validateRobotsTxt, validateSitemap };
|
|
2056
|
+
export { DNS_RECORD_TYPES, HTTP_HEADERS, LINK_REL_VALUES, REFERRER_POLICY_VALUES, STATUS_CODES, buildCacheControl, buildDnsQueryUrl, buildGeoUrl, buildLinkHeader, buildMapUrl, buildReferrerPolicy, countryCodeToFlag, formatCoordinates, formatTtl, getByCategory, getHeader, getHeadersByCategory, getStatusByCategory, getStatusCode, isClientError, isServerError, isSuccess, isValidIp, isValidIpv4, isValidIpv6, network_exports, parseDnsResponse, parseGeoResponse, parseHar, parseIpv6Address, parseUserAgent, searchHeaders, searchStatusCodes, statusCodeToText, typeNumberToLabel, validateDomain, validateHeaderName, validateHeaderValue, validateRobotsTxt, validateSitemap };
|
package/dist/index.cjs
CHANGED
|
@@ -2013,6 +2013,7 @@ var text_exports = {};
|
|
|
2013
2013
|
__export(text_exports, {
|
|
2014
2014
|
CASE_FORMATS: () => CASE_FORMATS,
|
|
2015
2015
|
DEFAULT_CONVERT_OPTIONS: () => DEFAULT_CONVERT_OPTIONS,
|
|
2016
|
+
EMOJI_TABLE: () => EMOJI_TABLE,
|
|
2016
2017
|
ESCAPE_MODES: () => ESCAPE_MODES,
|
|
2017
2018
|
LINE_OPS: () => LINE_OPS,
|
|
2018
2019
|
MORSE_CODE: () => MORSE_CODE,
|
|
@@ -2046,6 +2047,10 @@ __export(text_exports, {
|
|
|
2046
2047
|
generateSentences: () => generateSentences,
|
|
2047
2048
|
generateWords: () => generateWords,
|
|
2048
2049
|
getAvailableFonts: () => getAvailableFonts,
|
|
2050
|
+
getEmojiByCategory: () => getEmojiByCategory,
|
|
2051
|
+
getEmojiByChar: () => getEmojiByChar,
|
|
2052
|
+
getEmojiByShortcode: () => getEmojiByShortcode,
|
|
2053
|
+
getEmojiCategories: () => getEmojiCategories,
|
|
2049
2054
|
getMorseForChar: () => getMorseForChar,
|
|
2050
2055
|
getMorseTiming: () => getMorseTiming,
|
|
2051
2056
|
htmlToMarkdown: () => htmlToMarkdown,
|
|
@@ -2062,6 +2067,7 @@ __export(text_exports, {
|
|
|
2062
2067
|
renderMarkdown: () => renderMarkdown,
|
|
2063
2068
|
romanToNumber: () => romanToNumber,
|
|
2064
2069
|
scoreReadability: () => scoreReadability,
|
|
2070
|
+
searchEmoji: () => searchEmoji,
|
|
2065
2071
|
sentenceCount: () => sentenceCount,
|
|
2066
2072
|
slugify: () => slugify,
|
|
2067
2073
|
slugifyAll: () => slugifyAll,
|
|
@@ -4671,6 +4677,305 @@ function analyzeSentenceLengths(text) {
|
|
|
4671
4677
|
buckets
|
|
4672
4678
|
};
|
|
4673
4679
|
}
|
|
4680
|
+
var EMOJI_TABLE = [
|
|
4681
|
+
{ emoji: "\u{1F600}", name: "grinning face", shortcode: "grinning", codepoint: "U+1F600", category: "Smileys & Emotion", keywords: ["happy", "smile"] },
|
|
4682
|
+
{ emoji: "\u{1F603}", name: "grinning face with big eyes", shortcode: "smiley", codepoint: "U+1F603", category: "Smileys & Emotion", keywords: ["happy", "joy"] },
|
|
4683
|
+
{ emoji: "\u{1F604}", name: "grinning face with smiling eyes", shortcode: "smile", codepoint: "U+1F604", category: "Smileys & Emotion", keywords: ["happy", "joy"] },
|
|
4684
|
+
{ emoji: "\u{1F601}", name: "beaming face with smiling eyes", shortcode: "grin", codepoint: "U+1F601", category: "Smileys & Emotion", keywords: ["happy", "teeth"] },
|
|
4685
|
+
{ emoji: "\u{1F606}", name: "grinning squinting face", shortcode: "laughing", codepoint: "U+1F606", category: "Smileys & Emotion", keywords: ["laugh", "haha"] },
|
|
4686
|
+
{ emoji: "\u{1F605}", name: "grinning face with sweat", shortcode: "sweat_smile", codepoint: "U+1F605", category: "Smileys & Emotion", keywords: ["nervous", "relief"] },
|
|
4687
|
+
{ emoji: "\u{1F923}", name: "rolling on the floor laughing", shortcode: "rofl", codepoint: "U+1F923", category: "Smileys & Emotion", keywords: ["lol", "funny"] },
|
|
4688
|
+
{ emoji: "\u{1F602}", name: "face with tears of joy", shortcode: "joy", codepoint: "U+1F602", category: "Smileys & Emotion", keywords: ["lol", "funny", "crying laughing"] },
|
|
4689
|
+
{ emoji: "\u{1F642}", name: "slightly smiling face", shortcode: "slightly_smiling_face", codepoint: "U+1F642", category: "Smileys & Emotion", keywords: ["smile"] },
|
|
4690
|
+
{ emoji: "\u{1F643}", name: "upside-down face", shortcode: "upside_down_face", codepoint: "U+1F643", category: "Smileys & Emotion", keywords: ["silly", "sarcasm"] },
|
|
4691
|
+
{ emoji: "\u{1F609}", name: "winking face", shortcode: "wink", codepoint: "U+1F609", category: "Smileys & Emotion", keywords: ["flirt"] },
|
|
4692
|
+
{ emoji: "\u{1F60A}", name: "smiling face with smiling eyes", shortcode: "blush", codepoint: "U+1F60A", category: "Smileys & Emotion", keywords: ["happy", "warm"] },
|
|
4693
|
+
{ emoji: "\u{1F607}", name: "smiling face with halo", shortcode: "innocent", codepoint: "U+1F607", category: "Smileys & Emotion", keywords: ["angel"] },
|
|
4694
|
+
{ emoji: "\u{1F970}", name: "smiling face with hearts", shortcode: "smiling_face_with_three_hearts", codepoint: "U+1F970", category: "Smileys & Emotion", keywords: ["love", "adore"] },
|
|
4695
|
+
{ emoji: "\u{1F60D}", name: "smiling face with heart-eyes", shortcode: "heart_eyes", codepoint: "U+1F60D", category: "Smileys & Emotion", keywords: ["love", "crush"] },
|
|
4696
|
+
{ emoji: "\u{1F929}", name: "star-struck", shortcode: "star_struck", codepoint: "U+1F929", category: "Smileys & Emotion", keywords: ["excited", "wow"] },
|
|
4697
|
+
{ emoji: "\u{1F618}", name: "face blowing a kiss", shortcode: "kissing_heart", codepoint: "U+1F618", category: "Smileys & Emotion", keywords: ["kiss", "love"] },
|
|
4698
|
+
{ emoji: "\u{1F617}", name: "kissing face", shortcode: "kissing", codepoint: "U+1F617", category: "Smileys & Emotion", keywords: ["kiss"] },
|
|
4699
|
+
{ emoji: "\u{1F60B}", name: "face savoring food", shortcode: "yum", codepoint: "U+1F60B", category: "Smileys & Emotion", keywords: ["tasty", "delicious"] },
|
|
4700
|
+
{ emoji: "\u{1F61B}", name: "face with tongue", shortcode: "stuck_out_tongue", codepoint: "U+1F61B", category: "Smileys & Emotion", keywords: ["playful"] },
|
|
4701
|
+
{ emoji: "\u{1F61C}", name: "winking face with tongue", shortcode: "stuck_out_tongue_winking_eye", codepoint: "U+1F61C", category: "Smileys & Emotion", keywords: ["silly"] },
|
|
4702
|
+
{ emoji: "\u{1F92A}", name: "zany face", shortcode: "zany_face", codepoint: "U+1F92A", category: "Smileys & Emotion", keywords: ["crazy", "wild"] },
|
|
4703
|
+
{ emoji: "\u{1F61D}", name: "squinting face with tongue", shortcode: "stuck_out_tongue_closed_eyes", codepoint: "U+1F61D", category: "Smileys & Emotion", keywords: ["silly"] },
|
|
4704
|
+
{ emoji: "\u{1F911}", name: "money-mouth face", shortcode: "money_mouth_face", codepoint: "U+1F911", category: "Smileys & Emotion", keywords: ["rich", "dollar"] },
|
|
4705
|
+
{ emoji: "\u{1F917}", name: "smiling face with open hands", shortcode: "hugs", codepoint: "U+1F917", category: "Smileys & Emotion", keywords: ["hug"] },
|
|
4706
|
+
{ emoji: "\u{1F92D}", name: "face with hand over mouth", shortcode: "hand_over_mouth", codepoint: "U+1F92D", category: "Smileys & Emotion", keywords: ["oops", "giggle"] },
|
|
4707
|
+
{ emoji: "\u{1F92B}", name: "shushing face", shortcode: "shushing_face", codepoint: "U+1F92B", category: "Smileys & Emotion", keywords: ["quiet", "secret"] },
|
|
4708
|
+
{ emoji: "\u{1F914}", name: "thinking face", shortcode: "thinking", codepoint: "U+1F914", category: "Smileys & Emotion", keywords: ["hmm", "consider"] },
|
|
4709
|
+
{ emoji: "\u{1F910}", name: "zipper-mouth face", shortcode: "zipper_mouth_face", codepoint: "U+1F910", category: "Smileys & Emotion", keywords: ["secret", "silence"] },
|
|
4710
|
+
{ emoji: "\u{1F928}", name: "face with raised eyebrow", shortcode: "raised_eyebrow", codepoint: "U+1F928", category: "Smileys & Emotion", keywords: ["skeptical", "suspicious"] },
|
|
4711
|
+
{ emoji: "\u{1F610}", name: "neutral face", shortcode: "neutral_face", codepoint: "U+1F610", category: "Smileys & Emotion", keywords: ["meh"] },
|
|
4712
|
+
{ emoji: "\u{1F611}", name: "expressionless face", shortcode: "expressionless", codepoint: "U+1F611", category: "Smileys & Emotion", keywords: ["blank"] },
|
|
4713
|
+
{ emoji: "\u{1F636}", name: "face without mouth", shortcode: "no_mouth", codepoint: "U+1F636", category: "Smileys & Emotion", keywords: ["speechless"] },
|
|
4714
|
+
{ emoji: "\u{1F60F}", name: "smirking face", shortcode: "smirk", codepoint: "U+1F60F", category: "Smileys & Emotion", keywords: ["smug"] },
|
|
4715
|
+
{ emoji: "\u{1F612}", name: "unamused face", shortcode: "unamused", codepoint: "U+1F612", category: "Smileys & Emotion", keywords: ["annoyed"] },
|
|
4716
|
+
{ emoji: "\u{1F644}", name: "face with rolling eyes", shortcode: "roll_eyes", codepoint: "U+1F644", category: "Smileys & Emotion", keywords: ["annoyed", "whatever"] },
|
|
4717
|
+
{ emoji: "\u{1F62C}", name: "grimacing face", shortcode: "grimacing", codepoint: "U+1F62C", category: "Smileys & Emotion", keywords: ["awkward", "yikes"] },
|
|
4718
|
+
{ emoji: "\u{1F60C}", name: "relieved face", shortcode: "relieved", codepoint: "U+1F60C", category: "Smileys & Emotion", keywords: ["calm", "content"] },
|
|
4719
|
+
{ emoji: "\u{1F614}", name: "pensive face", shortcode: "pensive", codepoint: "U+1F614", category: "Smileys & Emotion", keywords: ["sad", "thoughtful"] },
|
|
4720
|
+
{ emoji: "\u{1F62A}", name: "sleepy face", shortcode: "sleepy", codepoint: "U+1F62A", category: "Smileys & Emotion", keywords: ["tired"] },
|
|
4721
|
+
{ emoji: "\u{1F924}", name: "drooling face", shortcode: "drooling_face", codepoint: "U+1F924", category: "Smileys & Emotion", keywords: ["hungry"] },
|
|
4722
|
+
{ emoji: "\u{1F634}", name: "sleeping face", shortcode: "sleeping", codepoint: "U+1F634", category: "Smileys & Emotion", keywords: ["zzz", "asleep"] },
|
|
4723
|
+
{ emoji: "\u{1F637}", name: "face with medical mask", shortcode: "mask", codepoint: "U+1F637", category: "Smileys & Emotion", keywords: ["sick", "ill"] },
|
|
4724
|
+
{ emoji: "\u{1F912}", name: "face with thermometer", shortcode: "face_with_thermometer", codepoint: "U+1F912", category: "Smileys & Emotion", keywords: ["sick", "fever"] },
|
|
4725
|
+
{ emoji: "\u{1F915}", name: "face with head-bandage", shortcode: "face_with_head_bandage", codepoint: "U+1F915", category: "Smileys & Emotion", keywords: ["hurt", "injured"] },
|
|
4726
|
+
{ emoji: "\u{1F922}", name: "nauseated face", shortcode: "nauseated_face", codepoint: "U+1F922", category: "Smileys & Emotion", keywords: ["sick", "gross"] },
|
|
4727
|
+
{ emoji: "\u{1F92E}", name: "face vomiting", shortcode: "vomiting_face", codepoint: "U+1F92E", category: "Smileys & Emotion", keywords: ["sick", "gross"] },
|
|
4728
|
+
{ emoji: "\u{1F927}", name: "sneezing face", shortcode: "sneezing_face", codepoint: "U+1F927", category: "Smileys & Emotion", keywords: ["sick", "cold"] },
|
|
4729
|
+
{ emoji: "\u{1F975}", name: "hot face", shortcode: "hot_face", codepoint: "U+1F975", category: "Smileys & Emotion", keywords: ["heat", "sweating"] },
|
|
4730
|
+
{ emoji: "\u{1F976}", name: "cold face", shortcode: "cold_face", codepoint: "U+1F976", category: "Smileys & Emotion", keywords: ["freezing", "frozen"] },
|
|
4731
|
+
{ emoji: "\u{1F635}", name: "knocked-out face", shortcode: "dizzy_face", codepoint: "U+1F635", category: "Smileys & Emotion", keywords: ["dizzy", "confused"] },
|
|
4732
|
+
{ emoji: "\u{1F92F}", name: "exploding head", shortcode: "exploding_head", codepoint: "U+1F92F", category: "Smileys & Emotion", keywords: ["mind blown", "shocked"] },
|
|
4733
|
+
{ emoji: "\u{1F973}", name: "partying face", shortcode: "partying_face", codepoint: "U+1F973", category: "Smileys & Emotion", keywords: ["celebrate", "party"] },
|
|
4734
|
+
{ emoji: "\u{1F60E}", name: "smiling face with sunglasses", shortcode: "sunglasses", codepoint: "U+1F60E", category: "Smileys & Emotion", keywords: ["cool"] },
|
|
4735
|
+
{ emoji: "\u{1F913}", name: "nerd face", shortcode: "nerd_face", codepoint: "U+1F913", category: "Smileys & Emotion", keywords: ["geek", "glasses"] },
|
|
4736
|
+
{ emoji: "\u{1F9D0}", name: "face with monocle", shortcode: "monocle_face", codepoint: "U+1F9D0", category: "Smileys & Emotion", keywords: ["inspect", "curious"] },
|
|
4737
|
+
{ emoji: "\u{1F615}", name: "confused face", shortcode: "confused", codepoint: "U+1F615", category: "Smileys & Emotion", keywords: ["puzzled"] },
|
|
4738
|
+
{ emoji: "\u{1F61F}", name: "worried face", shortcode: "worried", codepoint: "U+1F61F", category: "Smileys & Emotion", keywords: ["concerned"] },
|
|
4739
|
+
{ emoji: "\u{1F641}", name: "slightly frowning face", shortcode: "slightly_frowning_face", codepoint: "U+1F641", category: "Smileys & Emotion", keywords: ["sad"] },
|
|
4740
|
+
{ emoji: "\u{1F62E}", name: "face with open mouth", shortcode: "open_mouth", codepoint: "U+1F62E", category: "Smileys & Emotion", keywords: ["surprised", "wow"] },
|
|
4741
|
+
{ emoji: "\u{1F62F}", name: "hushed face", shortcode: "hushed", codepoint: "U+1F62F", category: "Smileys & Emotion", keywords: ["surprised"] },
|
|
4742
|
+
{ emoji: "\u{1F632}", name: "astonished face", shortcode: "astonished", codepoint: "U+1F632", category: "Smileys & Emotion", keywords: ["shocked"] },
|
|
4743
|
+
{ emoji: "\u{1F633}", name: "flushed face", shortcode: "flushed", codepoint: "U+1F633", category: "Smileys & Emotion", keywords: ["embarrassed", "blush"] },
|
|
4744
|
+
{ emoji: "\u{1F97A}", name: "pleading face", shortcode: "pleading_face", codepoint: "U+1F97A", category: "Smileys & Emotion", keywords: ["puppy eyes", "begging"] },
|
|
4745
|
+
{ emoji: "\u{1F626}", name: "frowning face with open mouth", shortcode: "frowning", codepoint: "U+1F626", category: "Smileys & Emotion", keywords: ["shocked"] },
|
|
4746
|
+
{ emoji: "\u{1F627}", name: "anguished face", shortcode: "anguished", codepoint: "U+1F627", category: "Smileys & Emotion", keywords: ["distressed"] },
|
|
4747
|
+
{ emoji: "\u{1F628}", name: "fearful face", shortcode: "fearful", codepoint: "U+1F628", category: "Smileys & Emotion", keywords: ["scared", "afraid"] },
|
|
4748
|
+
{ emoji: "\u{1F630}", name: "anxious face with sweat", shortcode: "cold_sweat", codepoint: "U+1F630", category: "Smileys & Emotion", keywords: ["nervous"] },
|
|
4749
|
+
{ emoji: "\u{1F625}", name: "sad but relieved face", shortcode: "disappointed_relieved", codepoint: "U+1F625", category: "Smileys & Emotion", keywords: ["sad"] },
|
|
4750
|
+
{ emoji: "\u{1F622}", name: "crying face", shortcode: "cry", codepoint: "U+1F622", category: "Smileys & Emotion", keywords: ["sad", "tear"] },
|
|
4751
|
+
{ emoji: "\u{1F62D}", name: "loudly crying face", shortcode: "sob", codepoint: "U+1F62D", category: "Smileys & Emotion", keywords: ["sad", "bawling"] },
|
|
4752
|
+
{ emoji: "\u{1F631}", name: "face screaming in fear", shortcode: "scream", codepoint: "U+1F631", category: "Smileys & Emotion", keywords: ["shocked", "horror"] },
|
|
4753
|
+
{ emoji: "\u{1F616}", name: "confounded face", shortcode: "confounded", codepoint: "U+1F616", category: "Smileys & Emotion", keywords: ["frustrated"] },
|
|
4754
|
+
{ emoji: "\u{1F623}", name: "persevering face", shortcode: "persevere", codepoint: "U+1F623", category: "Smileys & Emotion", keywords: ["struggling"] },
|
|
4755
|
+
{ emoji: "\u{1F61E}", name: "disappointed face", shortcode: "disappointed", codepoint: "U+1F61E", category: "Smileys & Emotion", keywords: ["sad", "let down"] },
|
|
4756
|
+
{ emoji: "\u{1F613}", name: "downcast face with sweat", shortcode: "sweat", codepoint: "U+1F613", category: "Smileys & Emotion", keywords: ["tired", "stressed"] },
|
|
4757
|
+
{ emoji: "\u{1F629}", name: "weary face", shortcode: "weary", codepoint: "U+1F629", category: "Smileys & Emotion", keywords: ["tired", "exhausted"] },
|
|
4758
|
+
{ emoji: "\u{1F62B}", name: "tired face", shortcode: "tired_face", codepoint: "U+1F62B", category: "Smileys & Emotion", keywords: ["exhausted"] },
|
|
4759
|
+
{ emoji: "\u{1F971}", name: "yawning face", shortcode: "yawning_face", codepoint: "U+1F971", category: "Smileys & Emotion", keywords: ["tired", "bored"] },
|
|
4760
|
+
{ emoji: "\u{1F624}", name: "face with steam from nose", shortcode: "triumph", codepoint: "U+1F624", category: "Smileys & Emotion", keywords: ["angry", "proud"] },
|
|
4761
|
+
{ emoji: "\u{1F621}", name: "pouting face", shortcode: "rage", codepoint: "U+1F621", category: "Smileys & Emotion", keywords: ["angry", "mad"] },
|
|
4762
|
+
{ emoji: "\u{1F620}", name: "angry face", shortcode: "angry", codepoint: "U+1F620", category: "Smileys & Emotion", keywords: ["mad"] },
|
|
4763
|
+
{ emoji: "\u{1F92C}", name: "face with symbols on mouth", shortcode: "cursing_face", codepoint: "U+1F92C", category: "Smileys & Emotion", keywords: ["swearing", "angry"] },
|
|
4764
|
+
{ emoji: "\u{1F608}", name: "smiling face with horns", shortcode: "smiling_imp", codepoint: "U+1F608", category: "Smileys & Emotion", keywords: ["devil", "evil"] },
|
|
4765
|
+
{ emoji: "\u{1F47F}", name: "angry face with horns", shortcode: "imp", codepoint: "U+1F47F", category: "Smileys & Emotion", keywords: ["devil"] },
|
|
4766
|
+
{ emoji: "\u{1F480}", name: "skull", shortcode: "skull", codepoint: "U+1F480", category: "Smileys & Emotion", keywords: ["dead", "death"] },
|
|
4767
|
+
{ emoji: "\u{1F921}", name: "clown face", shortcode: "clown_face", codepoint: "U+1F921", category: "Smileys & Emotion", keywords: ["joker"] },
|
|
4768
|
+
{ emoji: "\u{1F47B}", name: "ghost", shortcode: "ghost", codepoint: "U+1F47B", category: "Smileys & Emotion", keywords: ["spooky", "halloween"] },
|
|
4769
|
+
{ emoji: "\u{1F47D}", name: "alien", shortcode: "alien", codepoint: "U+1F47D", category: "Smileys & Emotion", keywords: ["ufo", "extraterrestrial"] },
|
|
4770
|
+
{ emoji: "\u{1F916}", name: "robot", shortcode: "robot", codepoint: "U+1F916", category: "Smileys & Emotion", keywords: ["ai", "bot"] },
|
|
4771
|
+
{ emoji: "\u{1F63A}", name: "grinning cat", shortcode: "smiley_cat", codepoint: "U+1F63A", category: "Smileys & Emotion", keywords: ["cat"] },
|
|
4772
|
+
{ emoji: "\u{1F639}", name: "cat with tears of joy", shortcode: "joy_cat", codepoint: "U+1F639", category: "Smileys & Emotion", keywords: ["cat", "laugh"] },
|
|
4773
|
+
{ emoji: "\u{1F63B}", name: "smiling cat with heart-eyes", shortcode: "heart_eyes_cat", codepoint: "U+1F63B", category: "Smileys & Emotion", keywords: ["cat", "love"] },
|
|
4774
|
+
{ emoji: "\u{1F44D}", name: "thumbs up", shortcode: "thumbsup", codepoint: "U+1F44D", category: "People & Body", keywords: ["approve", "like", "yes"] },
|
|
4775
|
+
{ emoji: "\u{1F44E}", name: "thumbs down", shortcode: "thumbsdown", codepoint: "U+1F44E", category: "People & Body", keywords: ["disapprove", "no"] },
|
|
4776
|
+
{ emoji: "\u{1F44C}", name: "OK hand", shortcode: "ok_hand", codepoint: "U+1F44C", category: "People & Body", keywords: ["okay", "perfect"] },
|
|
4777
|
+
{ emoji: "\u270C\uFE0F", name: "victory hand", shortcode: "v", codepoint: "U+270C U+FE0F", category: "People & Body", keywords: ["peace"] },
|
|
4778
|
+
{ emoji: "\u{1F91E}", name: "crossed fingers", shortcode: "crossed_fingers", codepoint: "U+1F91E", category: "People & Body", keywords: ["luck", "hope"] },
|
|
4779
|
+
{ emoji: "\u{1F918}", name: "sign of the horns", shortcode: "metal", codepoint: "U+1F918", category: "People & Body", keywords: ["rock"] },
|
|
4780
|
+
{ emoji: "\u{1F44F}", name: "clapping hands", shortcode: "clap", codepoint: "U+1F44F", category: "People & Body", keywords: ["applause", "bravo"] },
|
|
4781
|
+
{ emoji: "\u{1F64C}", name: "raising hands", shortcode: "raised_hands", codepoint: "U+1F64C", category: "People & Body", keywords: ["celebrate", "hooray"] },
|
|
4782
|
+
{ emoji: "\u{1F450}", name: "open hands", shortcode: "open_hands", codepoint: "U+1F450", category: "People & Body", keywords: ["hug"] },
|
|
4783
|
+
{ emoji: "\u{1F91D}", name: "handshake", shortcode: "handshake", codepoint: "U+1F91D", category: "People & Body", keywords: ["deal", "agreement"] },
|
|
4784
|
+
{ emoji: "\u{1F64F}", name: "folded hands", shortcode: "pray", codepoint: "U+1F64F", category: "People & Body", keywords: ["please", "thanks", "praying"] },
|
|
4785
|
+
{ emoji: "\u270D\uFE0F", name: "writing hand", shortcode: "writing_hand", codepoint: "U+270D U+FE0F", category: "People & Body", keywords: ["write"] },
|
|
4786
|
+
{ emoji: "\u{1F4AA}", name: "flexed biceps", shortcode: "muscle", codepoint: "U+1F4AA", category: "People & Body", keywords: ["strong", "gym"] },
|
|
4787
|
+
{ emoji: "\u{1F590}\uFE0F", name: "hand with fingers splayed", shortcode: "raised_hand_with_fingers_splayed", codepoint: "U+1F590 U+FE0F", category: "People & Body", keywords: ["stop"] },
|
|
4788
|
+
{ emoji: "\u{1F44B}", name: "waving hand", shortcode: "wave", codepoint: "U+1F44B", category: "People & Body", keywords: ["hello", "goodbye", "bye"] },
|
|
4789
|
+
{ emoji: "\u{1F440}", name: "eyes", shortcode: "eyes", codepoint: "U+1F440", category: "People & Body", keywords: ["look", "watching"] },
|
|
4790
|
+
{ emoji: "\u{1F9E0}", name: "brain", shortcode: "brain", codepoint: "U+1F9E0", category: "People & Body", keywords: ["smart", "mind"] },
|
|
4791
|
+
{ emoji: "\u2764\uFE0F", name: "red heart", shortcode: "heart", codepoint: "U+2764 U+FE0F", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4792
|
+
{ emoji: "\u{1F9E1}", name: "orange heart", shortcode: "orange_heart", codepoint: "U+1F9E1", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4793
|
+
{ emoji: "\u{1F49B}", name: "yellow heart", shortcode: "yellow_heart", codepoint: "U+1F49B", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4794
|
+
{ emoji: "\u{1F49A}", name: "green heart", shortcode: "green_heart", codepoint: "U+1F49A", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4795
|
+
{ emoji: "\u{1F499}", name: "blue heart", shortcode: "blue_heart", codepoint: "U+1F499", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4796
|
+
{ emoji: "\u{1F49C}", name: "purple heart", shortcode: "purple_heart", codepoint: "U+1F49C", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4797
|
+
{ emoji: "\u{1F5A4}", name: "black heart", shortcode: "black_heart", codepoint: "U+1F5A4", category: "Smileys & Emotion", keywords: ["love", "dark"] },
|
|
4798
|
+
{ emoji: "\u{1F90D}", name: "white heart", shortcode: "white_heart", codepoint: "U+1F90D", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4799
|
+
{ emoji: "\u{1F494}", name: "broken heart", shortcode: "broken_heart", codepoint: "U+1F494", category: "Smileys & Emotion", keywords: ["heartbroken", "sad"] },
|
|
4800
|
+
{ emoji: "\u{1F495}", name: "two hearts", shortcode: "two_hearts", codepoint: "U+1F495", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4801
|
+
{ emoji: "\u{1F496}", name: "sparkling heart", shortcode: "sparkling_heart", codepoint: "U+1F496", category: "Smileys & Emotion", keywords: ["love"] },
|
|
4802
|
+
{ emoji: "\u{1F4AF}", name: "hundred points", shortcode: "100", codepoint: "U+1F4AF", category: "Smileys & Emotion", keywords: ["perfect", "score"] },
|
|
4803
|
+
{ emoji: "\u{1F525}", name: "fire", shortcode: "fire", codepoint: "U+1F525", category: "Travel & Places", keywords: ["lit", "hot", "flame"] },
|
|
4804
|
+
{ emoji: "\u2728", name: "sparkles", shortcode: "sparkles", codepoint: "U+2728", category: "Travel & Places", keywords: ["shiny", "glitter"] },
|
|
4805
|
+
{ emoji: "\u2B50", name: "star", shortcode: "star", codepoint: "U+2B50", category: "Travel & Places", keywords: ["favorite"] },
|
|
4806
|
+
{ emoji: "\u{1F31F}", name: "glowing star", shortcode: "star2", codepoint: "U+1F31F", category: "Travel & Places", keywords: ["shiny"] },
|
|
4807
|
+
{ emoji: "\u{1F389}", name: "party popper", shortcode: "tada", codepoint: "U+1F389", category: "Activities", keywords: ["celebrate", "congrats"] },
|
|
4808
|
+
{ emoji: "\u{1F38A}", name: "confetti ball", shortcode: "confetti_ball", codepoint: "U+1F38A", category: "Activities", keywords: ["celebrate"] },
|
|
4809
|
+
{ emoji: "\u{1F381}", name: "wrapped gift", shortcode: "gift", codepoint: "U+1F381", category: "Activities", keywords: ["present", "birthday"] },
|
|
4810
|
+
{ emoji: "\u{1F388}", name: "balloon", shortcode: "balloon", codepoint: "U+1F388", category: "Activities", keywords: ["party", "birthday"] },
|
|
4811
|
+
{ emoji: "\u{1F3C6}", name: "trophy", shortcode: "trophy", codepoint: "U+1F3C6", category: "Activities", keywords: ["winner", "award"] },
|
|
4812
|
+
{ emoji: "\u{1F947}", name: "1st place medal", shortcode: "first_place_medal", codepoint: "U+1F947", category: "Activities", keywords: ["gold", "winner"] },
|
|
4813
|
+
{ emoji: "\u26BD", name: "soccer ball", shortcode: "soccer", codepoint: "U+26BD", category: "Activities", keywords: ["football"] },
|
|
4814
|
+
{ emoji: "\u{1F3C0}", name: "basketball", shortcode: "basketball", codepoint: "U+1F3C0", category: "Activities", keywords: ["sport"] },
|
|
4815
|
+
{ emoji: "\u{1F3C8}", name: "american football", shortcode: "football", codepoint: "U+1F3C8", category: "Activities", keywords: ["sport", "nfl"] },
|
|
4816
|
+
{ emoji: "\u26BE", name: "baseball", shortcode: "baseball", codepoint: "U+26BE", category: "Activities", keywords: ["sport"] },
|
|
4817
|
+
{ emoji: "\u{1F3BE}", name: "tennis", shortcode: "tennis", codepoint: "U+1F3BE", category: "Activities", keywords: ["sport"] },
|
|
4818
|
+
{ emoji: "\u{1F3AE}", name: "video game", shortcode: "video_game", codepoint: "U+1F3AE", category: "Activities", keywords: ["gaming", "controller"] },
|
|
4819
|
+
{ emoji: "\u{1F3B2}", name: "game die", shortcode: "game_die", codepoint: "U+1F3B2", category: "Activities", keywords: ["dice", "random"] },
|
|
4820
|
+
{ emoji: "\u{1F3A7}", name: "headphone", shortcode: "headphones", codepoint: "U+1F3A7", category: "Objects", keywords: ["music", "audio"] },
|
|
4821
|
+
{ emoji: "\u{1F3B5}", name: "musical note", shortcode: "musical_note", codepoint: "U+1F3B5", category: "Objects", keywords: ["music"] },
|
|
4822
|
+
{ emoji: "\u{1F3B6}", name: "musical notes", shortcode: "notes", codepoint: "U+1F3B6", category: "Objects", keywords: ["music"] },
|
|
4823
|
+
{ emoji: "\u{1F436}", name: "dog face", shortcode: "dog", codepoint: "U+1F436", category: "Animals & Nature", keywords: ["puppy", "pet"] },
|
|
4824
|
+
{ emoji: "\u{1F431}", name: "cat face", shortcode: "cat", codepoint: "U+1F431", category: "Animals & Nature", keywords: ["kitten", "pet"] },
|
|
4825
|
+
{ emoji: "\u{1F42D}", name: "mouse face", shortcode: "mouse", codepoint: "U+1F42D", category: "Animals & Nature", keywords: ["rodent"] },
|
|
4826
|
+
{ emoji: "\u{1F439}", name: "hamster face", shortcode: "hamster", codepoint: "U+1F439", category: "Animals & Nature", keywords: ["pet"] },
|
|
4827
|
+
{ emoji: "\u{1F430}", name: "rabbit face", shortcode: "rabbit", codepoint: "U+1F430", category: "Animals & Nature", keywords: ["bunny"] },
|
|
4828
|
+
{ emoji: "\u{1F98A}", name: "fox", shortcode: "fox_face", codepoint: "U+1F98A", category: "Animals & Nature", keywords: ["animal"] },
|
|
4829
|
+
{ emoji: "\u{1F43B}", name: "bear", shortcode: "bear", codepoint: "U+1F43B", category: "Animals & Nature", keywords: ["animal"] },
|
|
4830
|
+
{ emoji: "\u{1F43C}", name: "panda", shortcode: "panda_face", codepoint: "U+1F43C", category: "Animals & Nature", keywords: ["animal"] },
|
|
4831
|
+
{ emoji: "\u{1F428}", name: "koala", shortcode: "koala", codepoint: "U+1F428", category: "Animals & Nature", keywords: ["animal"] },
|
|
4832
|
+
{ emoji: "\u{1F42F}", name: "tiger face", shortcode: "tiger", codepoint: "U+1F42F", category: "Animals & Nature", keywords: ["animal"] },
|
|
4833
|
+
{ emoji: "\u{1F981}", name: "lion", shortcode: "lion", codepoint: "U+1F981", category: "Animals & Nature", keywords: ["animal"] },
|
|
4834
|
+
{ emoji: "\u{1F42E}", name: "cow face", shortcode: "cow", codepoint: "U+1F42E", category: "Animals & Nature", keywords: ["animal"] },
|
|
4835
|
+
{ emoji: "\u{1F437}", name: "pig face", shortcode: "pig", codepoint: "U+1F437", category: "Animals & Nature", keywords: ["animal"] },
|
|
4836
|
+
{ emoji: "\u{1F438}", name: "frog", shortcode: "frog", codepoint: "U+1F438", category: "Animals & Nature", keywords: ["animal"] },
|
|
4837
|
+
{ emoji: "\u{1F435}", name: "monkey face", shortcode: "monkey_face", codepoint: "U+1F435", category: "Animals & Nature", keywords: ["animal"] },
|
|
4838
|
+
{ emoji: "\u{1F414}", name: "chicken", shortcode: "chicken", codepoint: "U+1F414", category: "Animals & Nature", keywords: ["animal", "bird"] },
|
|
4839
|
+
{ emoji: "\u{1F427}", name: "penguin", shortcode: "penguin", codepoint: "U+1F427", category: "Animals & Nature", keywords: ["animal", "bird"] },
|
|
4840
|
+
{ emoji: "\u{1F426}", name: "bird", shortcode: "bird", codepoint: "U+1F426", category: "Animals & Nature", keywords: ["animal"] },
|
|
4841
|
+
{ emoji: "\u{1F984}", name: "unicorn", shortcode: "unicorn", codepoint: "U+1F984", category: "Animals & Nature", keywords: ["fantasy"] },
|
|
4842
|
+
{ emoji: "\u{1F41D}", name: "honeybee", shortcode: "bee", codepoint: "U+1F41D", category: "Animals & Nature", keywords: ["insect"] },
|
|
4843
|
+
{ emoji: "\u{1F98B}", name: "butterfly", shortcode: "butterfly", codepoint: "U+1F98B", category: "Animals & Nature", keywords: ["insect"] },
|
|
4844
|
+
{ emoji: "\u{1F422}", name: "turtle", shortcode: "turtle", codepoint: "U+1F422", category: "Animals & Nature", keywords: ["animal", "slow"] },
|
|
4845
|
+
{ emoji: "\u{1F40D}", name: "snake", shortcode: "snake", codepoint: "U+1F40D", category: "Animals & Nature", keywords: ["animal"] },
|
|
4846
|
+
{ emoji: "\u{1F433}", name: "spouting whale", shortcode: "whale", codepoint: "U+1F433", category: "Animals & Nature", keywords: ["ocean"] },
|
|
4847
|
+
{ emoji: "\u{1F42C}", name: "dolphin", shortcode: "dolphin", codepoint: "U+1F42C", category: "Animals & Nature", keywords: ["ocean"] },
|
|
4848
|
+
{ emoji: "\u{1F41F}", name: "fish", shortcode: "fish", codepoint: "U+1F41F", category: "Animals & Nature", keywords: ["ocean"] },
|
|
4849
|
+
{ emoji: "\u{1F338}", name: "cherry blossom", shortcode: "cherry_blossom", codepoint: "U+1F338", category: "Animals & Nature", keywords: ["flower", "spring"] },
|
|
4850
|
+
{ emoji: "\u{1F339}", name: "rose", shortcode: "rose", codepoint: "U+1F339", category: "Animals & Nature", keywords: ["flower"] },
|
|
4851
|
+
{ emoji: "\u{1F33B}", name: "sunflower", shortcode: "sunflower", codepoint: "U+1F33B", category: "Animals & Nature", keywords: ["flower"] },
|
|
4852
|
+
{ emoji: "\u{1F308}", name: "rainbow", shortcode: "rainbow", codepoint: "U+1F308", category: "Travel & Places", keywords: ["colorful", "pride"] },
|
|
4853
|
+
{ emoji: "\u2600\uFE0F", name: "sun", shortcode: "sunny", codepoint: "U+2600 U+FE0F", category: "Travel & Places", keywords: ["sunshine", "weather"] },
|
|
4854
|
+
{ emoji: "\u26C5", name: "sun behind cloud", shortcode: "partly_sunny", codepoint: "U+26C5", category: "Travel & Places", keywords: ["weather"] },
|
|
4855
|
+
{ emoji: "\u2601\uFE0F", name: "cloud", shortcode: "cloud", codepoint: "U+2601 U+FE0F", category: "Travel & Places", keywords: ["weather"] },
|
|
4856
|
+
{ emoji: "\u{1F327}\uFE0F", name: "cloud with rain", shortcode: "cloud_with_rain", codepoint: "U+1F327 U+FE0F", category: "Travel & Places", keywords: ["weather", "rain"] },
|
|
4857
|
+
{ emoji: "\u26C8\uFE0F", name: "cloud with lightning and rain", shortcode: "thunder_cloud_and_rain", codepoint: "U+26C8 U+FE0F", category: "Travel & Places", keywords: ["storm"] },
|
|
4858
|
+
{ emoji: "\u2744\uFE0F", name: "snowflake", shortcode: "snowflake", codepoint: "U+2744 U+FE0F", category: "Travel & Places", keywords: ["cold", "winter"] },
|
|
4859
|
+
{ emoji: "\u26C4", name: "snowman without snow", shortcode: "snowman_without_snow", codepoint: "U+26C4", category: "Travel & Places", keywords: ["winter"] },
|
|
4860
|
+
{ emoji: "\u{1F30A}", name: "water wave", shortcode: "ocean", codepoint: "U+1F30A", category: "Travel & Places", keywords: ["sea", "surf"] },
|
|
4861
|
+
{ emoji: "\u{1F34E}", name: "red apple", shortcode: "apple", codepoint: "U+1F34E", category: "Food & Drink", keywords: ["fruit"] },
|
|
4862
|
+
{ emoji: "\u{1F34C}", name: "banana", shortcode: "banana", codepoint: "U+1F34C", category: "Food & Drink", keywords: ["fruit"] },
|
|
4863
|
+
{ emoji: "\u{1F355}", name: "pizza", shortcode: "pizza", codepoint: "U+1F355", category: "Food & Drink", keywords: ["food"] },
|
|
4864
|
+
{ emoji: "\u{1F354}", name: "hamburger", shortcode: "hamburger", codepoint: "U+1F354", category: "Food & Drink", keywords: ["burger", "food"] },
|
|
4865
|
+
{ emoji: "\u{1F35F}", name: "french fries", shortcode: "fries", codepoint: "U+1F35F", category: "Food & Drink", keywords: ["food"] },
|
|
4866
|
+
{ emoji: "\u{1F32E}", name: "taco", shortcode: "taco", codepoint: "U+1F32E", category: "Food & Drink", keywords: ["food"] },
|
|
4867
|
+
{ emoji: "\u{1F363}", name: "sushi", shortcode: "sushi", codepoint: "U+1F363", category: "Food & Drink", keywords: ["food"] },
|
|
4868
|
+
{ emoji: "\u{1F369}", name: "doughnut", shortcode: "doughnut", codepoint: "U+1F369", category: "Food & Drink", keywords: ["donut", "food"] },
|
|
4869
|
+
{ emoji: "\u{1F36A}", name: "cookie", shortcode: "cookie", codepoint: "U+1F36A", category: "Food & Drink", keywords: ["food"] },
|
|
4870
|
+
{ emoji: "\u{1F382}", name: "birthday cake", shortcode: "birthday", codepoint: "U+1F382", category: "Food & Drink", keywords: ["cake", "party"] },
|
|
4871
|
+
{ emoji: "\u{1F370}", name: "shortcake", shortcode: "cake", codepoint: "U+1F370", category: "Food & Drink", keywords: ["dessert"] },
|
|
4872
|
+
{ emoji: "\u{1F36B}", name: "chocolate bar", shortcode: "chocolate_bar", codepoint: "U+1F36B", category: "Food & Drink", keywords: ["candy", "sweet"] },
|
|
4873
|
+
{ emoji: "\u{1F37F}", name: "popcorn", shortcode: "popcorn", codepoint: "U+1F37F", category: "Food & Drink", keywords: ["movie", "snack"] },
|
|
4874
|
+
{ emoji: "\u2615", name: "hot beverage", shortcode: "coffee", codepoint: "U+2615", category: "Food & Drink", keywords: ["tea", "drink"] },
|
|
4875
|
+
{ emoji: "\u{1F37A}", name: "beer mug", shortcode: "beer", codepoint: "U+1F37A", category: "Food & Drink", keywords: ["drink", "alcohol"] },
|
|
4876
|
+
{ emoji: "\u{1F377}", name: "wine glass", shortcode: "wine_glass", codepoint: "U+1F377", category: "Food & Drink", keywords: ["drink", "alcohol"] },
|
|
4877
|
+
{ emoji: "\u{1F37E}", name: "bottle with popping cork", shortcode: "champagne", codepoint: "U+1F37E", category: "Food & Drink", keywords: ["celebrate", "drink"] },
|
|
4878
|
+
{ emoji: "\u{1F680}", name: "rocket", shortcode: "rocket", codepoint: "U+1F680", category: "Travel & Places", keywords: ["launch", "space", "ship"] },
|
|
4879
|
+
{ emoji: "\u2708\uFE0F", name: "airplane", shortcode: "airplane", codepoint: "U+2708 U+FE0F", category: "Travel & Places", keywords: ["flight", "travel"] },
|
|
4880
|
+
{ emoji: "\u{1F697}", name: "automobile", shortcode: "car", codepoint: "U+1F697", category: "Travel & Places", keywords: ["vehicle"] },
|
|
4881
|
+
{ emoji: "\u{1F6B2}", name: "bicycle", shortcode: "bike", codepoint: "U+1F6B2", category: "Travel & Places", keywords: ["cycling"] },
|
|
4882
|
+
{ emoji: "\u{1F6A2}", name: "ship", shortcode: "ship", codepoint: "U+1F6A2", category: "Travel & Places", keywords: ["boat"] },
|
|
4883
|
+
{ emoji: "\u{1F3E0}", name: "house", shortcode: "house", codepoint: "U+1F3E0", category: "Travel & Places", keywords: ["home"] },
|
|
4884
|
+
{ emoji: "\u{1F3E2}", name: "office building", shortcode: "office", codepoint: "U+1F3E2", category: "Travel & Places", keywords: ["work"] },
|
|
4885
|
+
{ emoji: "\u{1F30D}", name: "globe showing Europe-Africa", shortcode: "earth_africa", codepoint: "U+1F30D", category: "Travel & Places", keywords: ["world", "global"] },
|
|
4886
|
+
{ emoji: "\u{1F5FA}\uFE0F", name: "world map", shortcode: "world_map", codepoint: "U+1F5FA U+FE0F", category: "Travel & Places", keywords: ["travel"] },
|
|
4887
|
+
{ emoji: "\u{1F319}", name: "crescent moon", shortcode: "crescent_moon", codepoint: "U+1F319", category: "Travel & Places", keywords: ["night"] },
|
|
4888
|
+
{ emoji: "\u{1F4BB}", name: "laptop", shortcode: "computer", codepoint: "U+1F4BB", category: "Objects", keywords: ["dev", "code"] },
|
|
4889
|
+
{ emoji: "\u{1F5A5}\uFE0F", name: "desktop computer", shortcode: "desktop_computer", codepoint: "U+1F5A5 U+FE0F", category: "Objects", keywords: ["dev"] },
|
|
4890
|
+
{ emoji: "\u2328\uFE0F", name: "keyboard", shortcode: "keyboard", codepoint: "U+2328 U+FE0F", category: "Objects", keywords: ["type", "dev"] },
|
|
4891
|
+
{ emoji: "\u{1F5B1}\uFE0F", name: "computer mouse", shortcode: "computer_mouse", codepoint: "U+1F5B1 U+FE0F", category: "Objects", keywords: ["dev"] },
|
|
4892
|
+
{ emoji: "\u{1F4F1}", name: "mobile phone", shortcode: "iphone", codepoint: "U+1F4F1", category: "Objects", keywords: ["phone"] },
|
|
4893
|
+
{ emoji: "\u260E\uFE0F", name: "telephone", shortcode: "telephone", codepoint: "U+260E U+FE0F", category: "Objects", keywords: ["phone"] },
|
|
4894
|
+
{ emoji: "\u{1F4A1}", name: "light bulb", shortcode: "bulb", codepoint: "U+1F4A1", category: "Objects", keywords: ["idea"] },
|
|
4895
|
+
{ emoji: "\u{1F50B}", name: "battery", shortcode: "battery", codepoint: "U+1F50B", category: "Objects", keywords: ["power"] },
|
|
4896
|
+
{ emoji: "\u{1F50C}", name: "electric plug", shortcode: "electric_plug", codepoint: "U+1F50C", category: "Objects", keywords: ["power"] },
|
|
4897
|
+
{ emoji: "\u{1F4F7}", name: "camera", shortcode: "camera", codepoint: "U+1F4F7", category: "Objects", keywords: ["photo"] },
|
|
4898
|
+
{ emoji: "\u{1F4DA}", name: "books", shortcode: "books", codepoint: "U+1F4DA", category: "Objects", keywords: ["read", "study"] },
|
|
4899
|
+
{ emoji: "\u{1F4D6}", name: "open book", shortcode: "book", codepoint: "U+1F4D6", category: "Objects", keywords: ["read"] },
|
|
4900
|
+
{ emoji: "\u{1F4DD}", name: "memo", shortcode: "memo", codepoint: "U+1F4DD", category: "Objects", keywords: ["note", "write"] },
|
|
4901
|
+
{ emoji: "\u270F\uFE0F", name: "pencil", shortcode: "pencil2", codepoint: "U+270F U+FE0F", category: "Objects", keywords: ["write"] },
|
|
4902
|
+
{ emoji: "\u{1F58A}\uFE0F", name: "pen", shortcode: "pen", codepoint: "U+1F58A U+FE0F", category: "Objects", keywords: ["write"] },
|
|
4903
|
+
{ emoji: "\u{1F4CC}", name: "pushpin", shortcode: "pushpin", codepoint: "U+1F4CC", category: "Objects", keywords: ["pin"] },
|
|
4904
|
+
{ emoji: "\u{1F4CE}", name: "paperclip", shortcode: "paperclip", codepoint: "U+1F4CE", category: "Objects", keywords: ["attach"] },
|
|
4905
|
+
{ emoji: "\u{1F517}", name: "link", shortcode: "link", codepoint: "U+1F517", category: "Objects", keywords: ["url", "chain"] },
|
|
4906
|
+
{ emoji: "\u{1F512}", name: "locked", shortcode: "lock", codepoint: "U+1F512", category: "Objects", keywords: ["secure", "private"] },
|
|
4907
|
+
{ emoji: "\u{1F513}", name: "unlocked", shortcode: "unlock", codepoint: "U+1F513", category: "Objects", keywords: ["open"] },
|
|
4908
|
+
{ emoji: "\u{1F511}", name: "key", shortcode: "key", codepoint: "U+1F511", category: "Objects", keywords: ["password"] },
|
|
4909
|
+
{ emoji: "\u{1F50D}", name: "magnifying glass tilted left", shortcode: "mag", codepoint: "U+1F50D", category: "Objects", keywords: ["search", "find"] },
|
|
4910
|
+
{ emoji: "\u2699\uFE0F", name: "gear", shortcode: "gear", codepoint: "U+2699 U+FE0F", category: "Objects", keywords: ["settings", "config"] },
|
|
4911
|
+
{ emoji: "\u{1F6E0}\uFE0F", name: "hammer and wrench", shortcode: "hammer_and_wrench", codepoint: "U+1F6E0 U+FE0F", category: "Objects", keywords: ["tools", "build"] },
|
|
4912
|
+
{ emoji: "\u{1F41B}", name: "bug", shortcode: "bug", codepoint: "U+1F41B", category: "Animals & Nature", keywords: ["insect", "error", "debug"] },
|
|
4913
|
+
{ emoji: "\u{1F4B0}", name: "money bag", shortcode: "moneybag", codepoint: "U+1F4B0", category: "Objects", keywords: ["cash", "rich"] },
|
|
4914
|
+
{ emoji: "\u{1F4B5}", name: "dollar banknote", shortcode: "dollar", codepoint: "U+1F4B5", category: "Objects", keywords: ["money", "cash"] },
|
|
4915
|
+
{ emoji: "\u{1F4B3}", name: "credit card", shortcode: "credit_card", codepoint: "U+1F4B3", category: "Objects", keywords: ["payment"] },
|
|
4916
|
+
{ emoji: "\u{1F4C8}", name: "chart increasing", shortcode: "chart_with_upwards_trend", codepoint: "U+1F4C8", category: "Objects", keywords: ["growth", "stocks"] },
|
|
4917
|
+
{ emoji: "\u{1F4C9}", name: "chart decreasing", shortcode: "chart_with_downwards_trend", codepoint: "U+1F4C9", category: "Objects", keywords: ["decline", "stocks"] },
|
|
4918
|
+
{ emoji: "\u{1F4CA}", name: "bar chart", shortcode: "bar_chart", codepoint: "U+1F4CA", category: "Objects", keywords: ["data", "stats"] },
|
|
4919
|
+
{ emoji: "\u{1F4C5}", name: "calendar", shortcode: "date", codepoint: "U+1F4C5", category: "Objects", keywords: ["schedule"] },
|
|
4920
|
+
{ emoji: "\u23F0", name: "alarm clock", shortcode: "alarm_clock", codepoint: "U+23F0", category: "Objects", keywords: ["time", "wake"] },
|
|
4921
|
+
{ emoji: "\u23F3", name: "hourglass not done", shortcode: "hourglass_flowing_sand", codepoint: "U+23F3", category: "Objects", keywords: ["waiting", "time"] },
|
|
4922
|
+
{ emoji: "\u2705", name: "check mark button", shortcode: "white_check_mark", codepoint: "U+2705", category: "Symbols", keywords: ["done", "correct", "yes"] },
|
|
4923
|
+
{ emoji: "\u2714\uFE0F", name: "check mark", shortcode: "heavy_check_mark", codepoint: "U+2714 U+FE0F", category: "Symbols", keywords: ["done", "correct"] },
|
|
4924
|
+
{ emoji: "\u274C", name: "cross mark", shortcode: "x", codepoint: "U+274C", category: "Symbols", keywords: ["wrong", "no", "error"] },
|
|
4925
|
+
{ emoji: "\u2757", name: "exclamation mark", shortcode: "exclamation", codepoint: "U+2757", category: "Symbols", keywords: ["warning", "important"] },
|
|
4926
|
+
{ emoji: "\u2753", name: "question mark", shortcode: "question", codepoint: "U+2753", category: "Symbols", keywords: ["ask"] },
|
|
4927
|
+
{ emoji: "\u26A0\uFE0F", name: "warning", shortcode: "warning", codepoint: "U+26A0 U+FE0F", category: "Symbols", keywords: ["caution", "alert"] },
|
|
4928
|
+
{ emoji: "\u{1F6AB}", name: "prohibited", shortcode: "no_entry_sign", codepoint: "U+1F6AB", category: "Symbols", keywords: ["forbidden", "banned"] },
|
|
4929
|
+
{ emoji: "\u{1F534}", name: "red circle", shortcode: "red_circle", codepoint: "U+1F534", category: "Symbols", keywords: ["status", "stop"] },
|
|
4930
|
+
{ emoji: "\u{1F7E2}", name: "green circle", shortcode: "green_circle", codepoint: "U+1F7E2", category: "Symbols", keywords: ["status", "go"] },
|
|
4931
|
+
{ emoji: "\u{1F7E1}", name: "yellow circle", shortcode: "yellow_circle", codepoint: "U+1F7E1", category: "Symbols", keywords: ["status", "warning"] },
|
|
4932
|
+
{ emoji: "\u{1F535}", name: "blue circle", shortcode: "blue_circle", codepoint: "U+1F535", category: "Symbols", keywords: ["status"] },
|
|
4933
|
+
{ emoji: "\u2B06\uFE0F", name: "up arrow", shortcode: "arrow_up", codepoint: "U+2B06 U+FE0F", category: "Symbols", keywords: ["direction"] },
|
|
4934
|
+
{ emoji: "\u2B07\uFE0F", name: "down arrow", shortcode: "arrow_down", codepoint: "U+2B07 U+FE0F", category: "Symbols", keywords: ["direction"] },
|
|
4935
|
+
{ emoji: "\u27A1\uFE0F", name: "right arrow", shortcode: "arrow_right", codepoint: "U+27A1 U+FE0F", category: "Symbols", keywords: ["direction"] },
|
|
4936
|
+
{ emoji: "\u2B05\uFE0F", name: "left arrow", shortcode: "arrow_left", codepoint: "U+2B05 U+FE0F", category: "Symbols", keywords: ["direction"] },
|
|
4937
|
+
{ emoji: "\u{1F504}", name: "counterclockwise arrows button", shortcode: "arrows_counterclockwise", codepoint: "U+1F504", category: "Symbols", keywords: ["refresh", "reload", "sync"] },
|
|
4938
|
+
{ emoji: "\u267B\uFE0F", name: "recycling symbol", shortcode: "recycle", codepoint: "U+267B U+FE0F", category: "Symbols", keywords: ["reuse", "green"] },
|
|
4939
|
+
{ emoji: "\u{1F195}", name: "NEW button", shortcode: "new", codepoint: "U+1F195", category: "Symbols", keywords: ["fresh"] },
|
|
4940
|
+
{ emoji: "\u{1F193}", name: "FREE button", shortcode: "free", codepoint: "U+1F193", category: "Symbols", keywords: ["gratis"] },
|
|
4941
|
+
{ emoji: "\u{1F4A4}", name: "zzz", shortcode: "zzz", codepoint: "U+1F4A4", category: "Symbols", keywords: ["sleep", "tired"] },
|
|
4942
|
+
{ emoji: "\u{1F4AC}", name: "speech balloon", shortcode: "speech_balloon", codepoint: "U+1F4AC", category: "Objects", keywords: ["chat", "talk"] },
|
|
4943
|
+
{ emoji: "\u{1F4AD}", name: "thought balloon", shortcode: "thought_balloon", codepoint: "U+1F4AD", category: "Objects", keywords: ["think"] },
|
|
4944
|
+
{ emoji: "\u{1F5E3}\uFE0F", name: "speaking head", shortcode: "speaking_head", codepoint: "U+1F5E3 U+FE0F", category: "People & Body", keywords: ["talk"] },
|
|
4945
|
+
{ emoji: "\u{1F3AF}", name: "direct hit", shortcode: "dart", codepoint: "U+1F3AF", category: "Activities", keywords: ["target", "goal"] },
|
|
4946
|
+
{ emoji: "\u{1F6A9}", name: "triangular flag", shortcode: "triangular_flag_on_post", codepoint: "U+1F6A9", category: "Flags", keywords: ["flag", "report"] },
|
|
4947
|
+
{ emoji: "\u{1F3C1}", name: "chequered flag", shortcode: "checkered_flag", codepoint: "U+1F3C1", category: "Flags", keywords: ["finish", "race"] },
|
|
4948
|
+
{ emoji: "\u{1F1FA}\u{1F1F8}", name: "flag: United States", shortcode: "us", codepoint: "U+1F1FA U+1F1F8", category: "Flags", keywords: ["usa", "america"] },
|
|
4949
|
+
{ emoji: "\u{1F1EC}\u{1F1E7}", name: "flag: United Kingdom", shortcode: "gb", codepoint: "U+1F1EC U+1F1E7", category: "Flags", keywords: ["uk", "britain"] },
|
|
4950
|
+
{ emoji: "\u{1F1EE}\u{1F1F3}", name: "flag: India", shortcode: "in", codepoint: "U+1F1EE U+1F1F3", category: "Flags", keywords: ["india"] },
|
|
4951
|
+
{ emoji: "\u{1F1EF}\u{1F1F5}", name: "flag: Japan", shortcode: "jp", codepoint: "U+1F1EF U+1F1F5", category: "Flags", keywords: ["japan"] },
|
|
4952
|
+
{ emoji: "\u{1F1E9}\u{1F1EA}", name: "flag: Germany", shortcode: "de", codepoint: "U+1F1E9 U+1F1EA", category: "Flags", keywords: ["germany"] },
|
|
4953
|
+
{ emoji: "\u{1F1EB}\u{1F1F7}", name: "flag: France", shortcode: "fr", codepoint: "U+1F1EB U+1F1F7", category: "Flags", keywords: ["france"] },
|
|
4954
|
+
{ emoji: "\u{1F1E8}\u{1F1E6}", name: "flag: Canada", shortcode: "ca", codepoint: "U+1F1E8 U+1F1E6", category: "Flags", keywords: ["canada"] },
|
|
4955
|
+
{ emoji: "\u{1F1E6}\u{1F1FA}", name: "flag: Australia", shortcode: "au", codepoint: "U+1F1E6 U+1F1FA", category: "Flags", keywords: ["australia"] },
|
|
4956
|
+
{ emoji: "\u{1F1E7}\u{1F1F7}", name: "flag: Brazil", shortcode: "br", codepoint: "U+1F1E7 U+1F1F7", category: "Flags", keywords: ["brazil"] },
|
|
4957
|
+
{ emoji: "\u{1F1E8}\u{1F1F3}", name: "flag: China", shortcode: "cn", codepoint: "U+1F1E8 U+1F1F3", category: "Flags", keywords: ["china"] }
|
|
4958
|
+
];
|
|
4959
|
+
function searchEmoji(query) {
|
|
4960
|
+
const q = query.trim().toLowerCase().replace(/^:|:$/g, "");
|
|
4961
|
+
if (!q) return [];
|
|
4962
|
+
return EMOJI_TABLE.filter(
|
|
4963
|
+
(e) => e.name.toLowerCase().includes(q) || e.shortcode.toLowerCase().includes(q) || e.keywords.some((k) => k.toLowerCase().includes(q))
|
|
4964
|
+
);
|
|
4965
|
+
}
|
|
4966
|
+
function getEmojiByShortcode(shortcode) {
|
|
4967
|
+
const s = shortcode.trim().toLowerCase().replace(/^:|:$/g, "");
|
|
4968
|
+
return EMOJI_TABLE.find((e) => e.shortcode.toLowerCase() === s);
|
|
4969
|
+
}
|
|
4970
|
+
function getEmojiByChar(char) {
|
|
4971
|
+
return EMOJI_TABLE.find((e) => e.emoji === char);
|
|
4972
|
+
}
|
|
4973
|
+
function getEmojiByCategory(category) {
|
|
4974
|
+
return EMOJI_TABLE.filter((e) => e.category.toLowerCase() === category.trim().toLowerCase());
|
|
4975
|
+
}
|
|
4976
|
+
function getEmojiCategories() {
|
|
4977
|
+
return Array.from(new Set(EMOJI_TABLE.map((e) => e.category)));
|
|
4978
|
+
}
|
|
4674
4979
|
|
|
4675
4980
|
// src/tools/data.ts
|
|
4676
4981
|
var data_exports = {};
|
|
@@ -7554,6 +7859,7 @@ __export(units_exports, {
|
|
|
7554
7859
|
calculateLoan: () => calculateLoan,
|
|
7555
7860
|
calculateMarginMarkup: () => calculateMarginMarkup,
|
|
7556
7861
|
calculatePercentageChange: () => calculatePercentageChange,
|
|
7862
|
+
calculateRoi: () => calculateRoi,
|
|
7557
7863
|
calculateRuleOf72: () => calculateRuleOf72,
|
|
7558
7864
|
calculateSavingsGoal: () => calculateSavingsGoal,
|
|
7559
7865
|
calculateSimpleInterest: () => calculateSimpleInterest,
|
|
@@ -9337,17 +9643,46 @@ function calculateSavingsGoal(input) {
|
|
|
9337
9643
|
finalBalance: round4(goalAmount)
|
|
9338
9644
|
};
|
|
9339
9645
|
}
|
|
9646
|
+
function calculateRoi(input) {
|
|
9647
|
+
const { initialValue, finalValue, years } = input;
|
|
9648
|
+
if (!Number.isFinite(initialValue) || initialValue <= 0) {
|
|
9649
|
+
return { error: "initialValue must be a finite number greater than zero" };
|
|
9650
|
+
}
|
|
9651
|
+
if (!Number.isFinite(finalValue) || finalValue < 0) {
|
|
9652
|
+
return { error: "finalValue must be a finite, non-negative number" };
|
|
9653
|
+
}
|
|
9654
|
+
const round4 = (n) => Math.round(n * 1e4) / 1e4;
|
|
9655
|
+
const profit = finalValue - initialValue;
|
|
9656
|
+
const roiPercent = profit / initialValue * 100;
|
|
9657
|
+
const result = {
|
|
9658
|
+
initialValue: round4(initialValue),
|
|
9659
|
+
finalValue: round4(finalValue),
|
|
9660
|
+
profit: round4(profit),
|
|
9661
|
+
roiPercent: round4(roiPercent)
|
|
9662
|
+
};
|
|
9663
|
+
if (years !== void 0) {
|
|
9664
|
+
if (!Number.isFinite(years) || years <= 0) {
|
|
9665
|
+
return { error: "years must be a finite number greater than zero when provided" };
|
|
9666
|
+
}
|
|
9667
|
+
const annualizedReturnPercent = (Math.pow(finalValue / initialValue, 1 / years) - 1) * 100;
|
|
9668
|
+
result.years = round4(years);
|
|
9669
|
+
result.annualizedReturnPercent = round4(annualizedReturnPercent);
|
|
9670
|
+
}
|
|
9671
|
+
return result;
|
|
9672
|
+
}
|
|
9340
9673
|
|
|
9341
9674
|
// src/tools/network.ts
|
|
9342
9675
|
var network_exports = {};
|
|
9343
9676
|
__export(network_exports, {
|
|
9344
9677
|
DNS_RECORD_TYPES: () => DNS_RECORD_TYPES,
|
|
9345
9678
|
HTTP_HEADERS: () => HTTP_HEADERS,
|
|
9679
|
+
LINK_REL_VALUES: () => LINK_REL_VALUES,
|
|
9346
9680
|
REFERRER_POLICY_VALUES: () => REFERRER_POLICY_VALUES,
|
|
9347
9681
|
STATUS_CODES: () => STATUS_CODES,
|
|
9348
9682
|
buildCacheControl: () => buildCacheControl,
|
|
9349
9683
|
buildDnsQueryUrl: () => buildDnsQueryUrl,
|
|
9350
9684
|
buildGeoUrl: () => buildGeoUrl,
|
|
9685
|
+
buildLinkHeader: () => buildLinkHeader,
|
|
9351
9686
|
buildMapUrl: () => buildMapUrl,
|
|
9352
9687
|
buildReferrerPolicy: () => buildReferrerPolicy,
|
|
9353
9688
|
countryCodeToFlag: () => countryCodeToFlag,
|
|
@@ -11233,6 +11568,73 @@ function buildReferrerPolicy(policies) {
|
|
|
11233
11568
|
const metaTag = `<meta name="referrer" content="${last.value}">`;
|
|
11234
11569
|
return { header, headerName: "Referrer-Policy", snippet, metaTag, policies: entries, warnings };
|
|
11235
11570
|
}
|
|
11571
|
+
var LINK_REL_VALUES = [
|
|
11572
|
+
"preload",
|
|
11573
|
+
"preconnect",
|
|
11574
|
+
"prefetch",
|
|
11575
|
+
"prerender",
|
|
11576
|
+
"dns-prefetch",
|
|
11577
|
+
"canonical",
|
|
11578
|
+
"next",
|
|
11579
|
+
"prev",
|
|
11580
|
+
"alternate",
|
|
11581
|
+
"stylesheet",
|
|
11582
|
+
"icon",
|
|
11583
|
+
"modulepreload"
|
|
11584
|
+
];
|
|
11585
|
+
var _LINK_REL_INFO = {
|
|
11586
|
+
preload: "Tells the browser to fetch this resource early, before the parser would otherwise discover it, without blocking rendering. Requires an `as` attribute so the browser applies the right request priority and Content-Security-Policy check; omitting it commonly causes the resource to be fetched twice.",
|
|
11587
|
+
preconnect: "Tells the browser to start the connection handshake (DNS, TCP, TLS) to this origin early, before any real request to it is made, so the first actual request lands faster.",
|
|
11588
|
+
prefetch: "Tells the browser to fetch this resource at low priority for a likely future navigation and cache it. Unlike preload, it does not affect the current page load.",
|
|
11589
|
+
prerender: "Tells the browser to fetch and render this page in the background so navigating to it feels instant, at a real bandwidth and CPU cost if the user never navigates there.",
|
|
11590
|
+
"dns-prefetch": "Tells the browser to resolve this origin's DNS early, a lighter-weight version of preconnect that skips the TCP/TLS handshake.",
|
|
11591
|
+
canonical: "Tells search engines which URL is the authoritative version of this page, used to consolidate duplicate-content signals across query-string or protocol variants.",
|
|
11592
|
+
next: "Marks the next page in a paginated sequence, a hint search engines and some browsers use for pagination.",
|
|
11593
|
+
prev: "Marks the previous page in a paginated sequence.",
|
|
11594
|
+
alternate: "Points to an alternate version of this resource, such as a different language or an RSS feed.",
|
|
11595
|
+
stylesheet: 'Loads an external stylesheet, the same effect as a `<link rel="stylesheet">` tag but delivered as a response header instead.',
|
|
11596
|
+
icon: 'Points to this resource\'s favicon, the same effect as a `<link rel="icon">` tag but delivered as a response header instead.',
|
|
11597
|
+
modulepreload: "Tells the browser to fetch and parse this JavaScript module early, ahead of when the module graph would otherwise discover it."
|
|
11598
|
+
};
|
|
11599
|
+
function buildLinkHeader(links) {
|
|
11600
|
+
if (!Array.isArray(links) || links.length === 0) {
|
|
11601
|
+
return { error: "At least one link entry is required" };
|
|
11602
|
+
}
|
|
11603
|
+
const entries = [];
|
|
11604
|
+
for (const link of links) {
|
|
11605
|
+
const url = typeof link.url === "string" ? link.url.trim() : "";
|
|
11606
|
+
const rel = typeof link.rel === "string" ? link.rel.trim() : "";
|
|
11607
|
+
if (!url) return { error: "Each link entry requires a non-empty url" };
|
|
11608
|
+
if (!rel) return { error: "Each link entry requires a non-empty rel" };
|
|
11609
|
+
if (!LINK_REL_VALUES.includes(rel)) {
|
|
11610
|
+
return { error: `'${rel}' is not a supported rel value. Supported values: ${LINK_REL_VALUES.join(", ")}` };
|
|
11611
|
+
}
|
|
11612
|
+
const as = link.as?.trim() || void 0;
|
|
11613
|
+
const type = link.type?.trim() || void 0;
|
|
11614
|
+
const crossorigin = link.crossorigin === true;
|
|
11615
|
+
let value = `<${url}>; rel="${rel}"`;
|
|
11616
|
+
if (as) value += `; as="${as}"`;
|
|
11617
|
+
if (type) value += `; type="${type}"`;
|
|
11618
|
+
if (crossorigin) value += "; crossorigin";
|
|
11619
|
+
entries.push({ url, rel, as, type, crossorigin: crossorigin || void 0, value, explanation: _LINK_REL_INFO[rel] });
|
|
11620
|
+
}
|
|
11621
|
+
const warnings = [];
|
|
11622
|
+
for (const entry of entries) {
|
|
11623
|
+
if (entry.rel === "preload" && !entry.as) {
|
|
11624
|
+
warnings.push(`preload link for "${entry.url}" is missing an \`as\` attribute \u2014 the browser may fetch it twice or apply the wrong request priority.`);
|
|
11625
|
+
}
|
|
11626
|
+
if ((entry.rel === "preconnect" || entry.rel === "dns-prefetch") && (entry.as || entry.type)) {
|
|
11627
|
+
warnings.push(`${entry.rel} link for "${entry.url}" sets \`as\`/\`type\`, which it ignores since no specific resource is being fetched yet.`);
|
|
11628
|
+
}
|
|
11629
|
+
}
|
|
11630
|
+
const canonicalCount = entries.filter((e) => e.rel === "canonical").length;
|
|
11631
|
+
if (canonicalCount > 1) {
|
|
11632
|
+
warnings.push(`${canonicalCount} canonical links present \u2014 only one canonical URL should be declared per page.`);
|
|
11633
|
+
}
|
|
11634
|
+
const header = entries.map((e) => e.value).join(", ");
|
|
11635
|
+
const snippet = `Link: ${header}`;
|
|
11636
|
+
return { header, headerName: "Link", snippet, links: entries, warnings };
|
|
11637
|
+
}
|
|
11236
11638
|
function isValidIpv6HexGroup(g) {
|
|
11237
11639
|
return /^[0-9a-fA-F]{1,4}$/.test(g);
|
|
11238
11640
|
}
|