Skip to content

Commit b35b1f8

Browse files
committed
refactor(isFQDN): simplify function test cases and fix issue with numeric domain names
1 parent 700debc commit b35b1f8

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

src/lib/isFQDN.js

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,52 @@ export default function isFQDN(str, options) {
1717
str = str.substring(0, str.length - 1);
1818
}
1919
const parts = str.split('.');
20-
for (let i = 0; i < parts.length; i++) {
21-
if (parts[i].length > 63) {
20+
const tld = parts[parts.length - 1];
21+
22+
if (options.require_tld) {
23+
// disallow fqdns without tld
24+
if (parts.length < 2) {
2225
return false;
2326
}
24-
}
25-
if (options.require_tld) {
26-
const tld = parts.pop();
27-
if (!parts.length || !/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
27+
28+
if (!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
2829
return false;
2930
}
31+
3032
// disallow spaces && special characers
3133
if (/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20\u00A9\uFFFD]/.test(tld)) {
3234
return false;
3335
}
3436
}
35-
for (let part, i = 0; i < parts.length; i++) {
36-
part = parts[i];
37-
if (!options.allow_numeric_tld && i === parts.length - 1 && /^\d+$/.test(part)) {
38-
return false; // reject numeric TLDs
37+
38+
// reject numeric TLDs
39+
if (!options.allow_numeric_tld && /^\d+$/.test(tld)) {
40+
return false;
41+
}
42+
43+
return parts.every((part) => {
44+
if (part.length > 63) {
45+
return false;
3946
}
47+
4048
if (!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(part)) {
4149
return false;
4250
}
51+
4352
// disallow full-width chars
4453
if (/[\uff01-\uff5e]/.test(part)) {
4554
return false;
4655
}
47-
if (part[0] === '-' || part[part.length - 1] === '-') {
56+
57+
// disallow parts starting or ending with hyphen
58+
if (/^-|-$/.test(part)) {
4859
return false;
4960
}
61+
5062
if (!options.allow_underscores && /_/.test(part)) {
5163
return false;
5264
}
53-
}
54-
return true;
65+
66+
return true;
67+
});
5568
}

0 commit comments

Comments
 (0)