1- var URL = require ( 'url' )
1+ var WHATWGURL = require ( 'url' ) . URL
22 , namespaces = require ( './namespaces' )
33 ;
44
@@ -55,13 +55,18 @@ function safeTrim (val) {
5555exports . safeTrim = safeTrim ;
5656
5757/*
58- * Expose require('url').resolve, safely returning if either parameter
59- * isn't provided
58+ * Resolve a URL against a base URL, returning the original pathUrl if
59+ * either parameter isn't provided or if the URL is not resolvable (e.g.
60+ * tag: URIs and other non-http schemes that the URL constructor rejects).
6061 * @private
6162 */
6263function resolve ( baseUrl , pathUrl ) {
6364 if ( ! baseUrl || ! pathUrl ) return pathUrl ;
64- return URL . resolve ( baseUrl , pathUrl ) ;
65+ try {
66+ return new WHATWGURL ( pathUrl , baseUrl ) . href ;
67+ } catch ( e ) {
68+ return pathUrl ;
69+ }
6570}
6671exports . resolve = resolve ;
6772
@@ -72,8 +77,11 @@ exports.resolve = resolve;
7277 */
7378function isAbsoluteUrl ( uri ) {
7479 if ( ! uri || typeof uri !== 'string' ) return false ;
75- var parts = URL . parse ( uri ) ;
76- return Boolean ( parts . host ) ;
80+ try {
81+ return Boolean ( new WHATWGURL ( uri ) . host ) ;
82+ } catch ( e ) {
83+ return false ;
84+ }
7785}
7886exports . isAbsoluteUrl = isAbsoluteUrl ;
7987
@@ -130,22 +138,22 @@ function reresolve (node, baseurl) {
130138 if ( level [ el ] . constructor . name === 'Object' ) {
131139 if ( el == 'logo' || el == 'icon' || el == 'link' ) {
132140 if ( '#' in level [ el ] ) {
133- level [ el ] [ '#' ] = URL . resolve ( baseurl , level [ el ] [ '#' ] ) ;
141+ level [ el ] [ '#' ] = resolve ( baseurl , level [ el ] [ '#' ] ) ;
134142 }
135143 } else if ( el == 'image' ) {
136144 if ( 'url' in level [ el ] && level [ el ] [ 'url' ] . constructor . name === 'Object' && '#' in level [ el ] [ 'url' ] ) {
137- level [ el ] [ 'url' ] [ '#' ] = URL . resolve ( baseurl , level [ el ] [ 'url' ] [ '#' ] ) ;
145+ level [ el ] [ 'url' ] [ '#' ] = resolve ( baseurl , level [ el ] [ 'url' ] [ '#' ] ) ;
138146 }
139147 if ( 'link' in level [ el ] && level [ el ] [ 'link' ] . constructor . name === 'Object' && '#' in level [ el ] [ 'link' ] ) {
140- level [ el ] [ 'link' ] [ '#' ] = URL . resolve ( baseurl , level [ el ] [ 'link' ] [ '#' ] ) ;
148+ level [ el ] [ 'link' ] [ '#' ] = resolve ( baseurl , level [ el ] [ 'link' ] [ '#' ] ) ;
141149 }
142150 }
143151 if ( '@' in level [ el ] ) {
144152 var attrs = Object . keys ( level [ el ] [ '@' ] ) ;
145153 attrs . forEach ( function ( name ) {
146154 if ( name == 'href' || name == 'src' || name == 'uri' ) {
147155 if ( 'string' === typeof level [ el ] [ '@' ] [ name ] ) {
148- level [ el ] [ '@' ] [ name ] = URL . resolve ( baseurl , level [ el ] [ '@' ] [ name ] ) ;
156+ level [ el ] [ '@' ] [ name ] = resolve ( baseurl , level [ el ] [ '@' ] [ name ] ) ;
149157 }
150158 }
151159 } ) ;
0 commit comments