Skip to content

Commit d8f07bb

Browse files
author
Colin McDonnell
committed
Fix emoji
1 parent 39cbb69 commit d8f07bb

File tree

5 files changed

+23
-22
lines changed

5 files changed

+23
-22
lines changed

Diff for: deno/lib/__tests__/string.test.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,11 @@ test("emoji validations", () => {
133133
const emoji = z.string().emoji();
134134

135135
emoji.parse("🍺👩‍🚀🫡");
136-
emoji.parse("💚 💙 💜 💛 ❤️");
136+
emoji.parse("💚💙💜💛❤️");
137137
expect(() => emoji.parse(":-)")).toThrow();
138138
expect(() => emoji.parse("😀 is an emoji")).toThrow();
139+
expect(() => emoji.parse("😀stuff")).toThrow();
140+
expect(() => emoji.parse("stuff😀")).toThrow();
139141
});
140142

141143
test("uuid", () => {

Diff for: deno/lib/types.ts

+2-9
Original file line numberDiff line numberDiff line change
@@ -530,14 +530,7 @@ const emailRegex =
530530
// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression
531531

532532
const emojiRegex =
533-
/^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*$/;
534-
535-
// interface IsDateStringOptions extends StringDateOptions {
536-
/**
537-
* Match any configuration
538-
*/
539-
// any?: boolean;
540-
// }
533+
/(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]|\uFE0E|\uFE0F)/;
541534

542535
// Adapted from https://stackoverflow.com/a/3143231
543536
const datetimeRegex = (args: { precision: number | null; offset: boolean }) => {
@@ -660,7 +653,7 @@ export class ZodString extends ZodType<string, ZodStringDef> {
660653
status.dirty();
661654
}
662655
} else if (check.kind === "emoji") {
663-
if (!emojiRegex.test(input.data)) {
656+
if (![...input.data].every((char) => emojiRegex.test(char))) {
664657
ctx = this._getOrReturnCtx(input, ctx);
665658
addIssueToContext(ctx, {
666659
validation: "emoji",

Diff for: playground.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
import { z } from "./src";
22

3-
const schema = z.string().emoji();
3+
// const emoji = z.string().emoji();
44

5-
schema.parse("😀 is an emoji");
5+
const emojiRegex =
6+
/(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]|\uFE0E|\uFE0F)/;
7+
8+
function isEmoji(val: string) {
9+
return [...val].every((char) => emojiRegex.test(char));
10+
}
11+
console.log(isEmoji("🍺👩‍🚀🫡"));
12+
console.log(isEmoji("💚💙💜💛❤️"));
13+
console.log(isEmoji(":-)"));
14+
console.log(isEmoji("asdf"));
15+
console.log(isEmoji("😀stuff"));
16+
console.log(isEmoji("stuff😀"));

Diff for: src/__tests__/string.test.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,11 @@ test("emoji validations", () => {
132132
const emoji = z.string().emoji();
133133

134134
emoji.parse("🍺👩‍🚀🫡");
135-
emoji.parse("💚 💙 💜 💛 ❤️");
135+
emoji.parse("💚💙💜💛❤️");
136136
expect(() => emoji.parse(":-)")).toThrow();
137137
expect(() => emoji.parse("😀 is an emoji")).toThrow();
138+
expect(() => emoji.parse("😀stuff")).toThrow();
139+
expect(() => emoji.parse("stuff😀")).toThrow();
138140
});
139141

140142
test("uuid", () => {

Diff for: src/types.ts

+2-9
Original file line numberDiff line numberDiff line change
@@ -530,14 +530,7 @@ const emailRegex =
530530
// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression
531531

532532
const emojiRegex =
533-
/^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*$/;
534-
535-
// interface IsDateStringOptions extends StringDateOptions {
536-
/**
537-
* Match any configuration
538-
*/
539-
// any?: boolean;
540-
// }
533+
/(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]|\uFE0E|\uFE0F)/;
541534

542535
// Adapted from https://stackoverflow.com/a/3143231
543536
const datetimeRegex = (args: { precision: number | null; offset: boolean }) => {
@@ -660,7 +653,7 @@ export class ZodString extends ZodType<string, ZodStringDef> {
660653
status.dirty();
661654
}
662655
} else if (check.kind === "emoji") {
663-
if (!emojiRegex.test(input.data)) {
656+
if (![...input.data].every((char) => emojiRegex.test(char))) {
664657
ctx = this._getOrReturnCtx(input, ctx);
665658
addIssueToContext(ctx, {
666659
validation: "emoji",

0 commit comments

Comments
 (0)