@@ -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 , } | x n [ a - z 0 - 9 - ] { 2 , } ) $ / i. test ( tld ) ) {
27+
28+ if ( ! / ^ ( [ a - z \u00a1 - \uffff ] { 2 , } | x n [ a - z 0 - 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 - \uffff 0 - 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