Skip to content

Commit fc94973

Browse files
author
Sascha Goldhofer
committed
add: test form idn-email
1 parent a3ea498 commit fc94973

File tree

4 files changed

+67
-4
lines changed

4 files changed

+67
-4
lines changed

lib/validation/format.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import errors from "./errors";
33
import { JsonError, JsonSchema } from "../types";
44
import { Draft } from "../draft";
55
import validUrl from "valid-url";
6+
import { parse as parseIdnEmail } from "smtp-address-parser";
67

78
// referenced
89
// https://github.com/cfworker/cfworker/blob/main/packages/json-schema/src/format.ts
@@ -79,10 +80,10 @@ const formatValidators: Record<
7980
},
8081

8182
email: (draft, schema, value, pointer) => {
82-
// taken from https://github.com/ExodusMovement/schemasafe/blob/master/src/formats.js
8383
if (typeof value !== "string" || value === "") {
8484
return undefined;
8585
}
86+
// taken from https://github.com/ExodusMovement/schemasafe/blob/master/src/formats.js
8687
if (value[0] === '"') {
8788
return errors.formatEmailError({ value, pointer, schema });
8889
}
@@ -102,6 +103,22 @@ const formatValidators: Record<
102103
return undefined;
103104
},
104105

106+
/**
107+
* @draft 7
108+
* [RFC6531] https://json-schema.org/draft-07/json-schema-validation.html#RFC6531
109+
*/
110+
"idn-email": (draft, schema, value, pointer) => {
111+
if (typeof value !== "string" || value === "") {
112+
return undefined;
113+
}
114+
try {
115+
parseIdnEmail(value);
116+
return undefined;
117+
} catch (e) {
118+
return errors.formatEmailError({ value, pointer, schema });
119+
}
120+
},
121+
105122
hostname: (draft, schema, value, pointer) => {
106123
if (typeof value !== "string") {
107124
return undefined;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@
8484
"deepmerge": "^4.3.1",
8585
"fast-copy": "^3.0.1",
8686
"fast-deep-equal": "^3.1.3",
87-
"valid-url": "^1.0.9"
87+
"valid-url": "^1.0.9",
88+
"smtp-address-parser": "1.0.10"
8889
},
8990
"resolutions": {
9091
"json5": ">=2.2.3",

test/spec/v7/draft07.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const supportedTestCases = (t: FeatureTest) =>
2222
"format-idn",
2323
"format-idn-reference",
2424
"format-idn-hostname",
25-
"format-idn-email",
25+
// "format-idn-email",
2626
"float-overflow",
2727
"non-bmp-regex"
2828
].includes(t.name)

yarn.lock

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -997,7 +997,7 @@ commander@^10.0.1:
997997
resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
998998
integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
999999

1000-
commander@^2.20.0:
1000+
commander@^2.19.0, commander@^2.20.0:
10011001
version "2.20.3"
10021002
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
10031003
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1089,6 +1089,11 @@ dir-glob@^3.0.1:
10891089
dependencies:
10901090
path-type "^4.0.0"
10911091

1092+
1093+
version "1.0.0"
1094+
resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
1095+
integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==
1096+
10921097
doctrine@^3.0.0:
10931098
version "3.0.0"
10941099
resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@@ -2021,6 +2026,11 @@ mocha@^10.2.0:
20212026
yargs-parser "20.2.4"
20222027
yargs-unparser "2.0.0"
20232028

2029+
moo@^0.5.0:
2030+
version "0.5.2"
2031+
resolved "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c"
2032+
integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==
2033+
20242034
20252035
version "2.1.2"
20262036
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -2046,6 +2056,16 @@ natural-compare@^1.4.0:
20462056
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
20472057
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
20482058

2059+
nearley@^2.20.1:
2060+
version "2.20.1"
2061+
resolved "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474"
2062+
integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==
2063+
dependencies:
2064+
commander "^2.19.0"
2065+
moo "^0.5.0"
2066+
railroad-diagrams "^1.0.0"
2067+
randexp "0.4.6"
2068+
20492069
neo-async@^2.6.2:
20502070
version "2.6.2"
20512071
resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
@@ -2246,6 +2266,19 @@ queue-microtask@^1.2.2:
22462266
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
22472267
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
22482268

2269+
railroad-diagrams@^1.0.0:
2270+
version "1.0.0"
2271+
resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
2272+
integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==
2273+
2274+
2275+
version "0.4.6"
2276+
resolved "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
2277+
integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==
2278+
dependencies:
2279+
discontinuous-range "1.0.0"
2280+
ret "~0.1.10"
2281+
22492282
randombytes@^2.1.0:
22502283
version "2.1.0"
22512284
resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -2320,6 +2353,11 @@ resolve@^1.10.1, resolve@^1.20.0:
23202353
path-parse "^1.0.7"
23212354
supports-preserve-symlinks-flag "^1.0.0"
23222355

2356+
ret@~0.1.10:
2357+
version "0.1.15"
2358+
resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
2359+
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
2360+
23232361
reusify@^1.0.4:
23242362
version "1.0.4"
23252363
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
@@ -2413,6 +2451,13 @@ slash@^3.0.0:
24132451
resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
24142452
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
24152453

2454+
2455+
version "1.0.10"
2456+
resolved "https://registry.npmjs.org/smtp-address-parser/-/smtp-address-parser-1.0.10.tgz#9fc4ed6021f13dc3d8f591e0ad0d50454073025e"
2457+
integrity sha512-Osg9LmvGeAG/hyao4mldbflLOkkr3a+h4m1lwKCK5U8M6ZAr7tdXEz/+/vr752TSGE4MNUlUl9cIK2cB8cgzXg==
2458+
dependencies:
2459+
nearley "^2.20.1"
2460+
24162461
source-map-support@~0.5.20:
24172462
version "0.5.21"
24182463
resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"

0 commit comments

Comments
 (0)