@@ -38,11 +38,22 @@ const {
3838 * @property {function(string, function(PossibleFileSystemError & Error | null | undefined, FileSystemStats=): void): void } stat
3939 */
4040
41+ /**
42+ * @typedef {Object } ParsedIdentifier
43+ * @property {string } request
44+ * @property {string } query
45+ * @property {string } fragment
46+ * @property {boolean } directory
47+ * @property {boolean } module
48+ * @property {boolean } file
49+ */
50+
4151/**
4252 * @typedef {Object } ResolveRequest
4353 * @property {string | false } path
4454 * @property {string= } request
4555 * @property {string= } query
56+ * @property {string= } fragment
4657 * @property {boolean= } directory
4758 * @property {boolean= } module
4859 * @property {string= } descriptionFilePath
@@ -93,6 +104,7 @@ class Resolver {
93104 ") " +
94105 ( request . request || "" ) +
95106 ( request . query || "" ) +
107+ ( request . fragment || "" ) +
96108 ( request . directory ? " directory" : "" ) +
97109 ( request . module ? " module" : "" )
98110 ) ;
@@ -215,7 +227,7 @@ class Resolver {
215227 * @param {string } path context path
216228 * @param {string } request request string
217229 * @param {ResolveContext } resolveContext resolve context
218- * @param {function(Error | null, string=, ResolveRequest=): void } callback callback function
230+ * @param {function(Error | null, ( string|false) =, ResolveRequest=): void } callback callback function
219231 * @returns {void }
220232 */
221233 resolve ( context , path , request , resolveContext , callback ) {
@@ -230,7 +242,9 @@ class Resolver {
230242 const finishResolved = result => {
231243 return callback (
232244 null ,
233- result . path === false ? false : result . path + ( result . query || "" ) ,
245+ result . path === false
246+ ? false
247+ : `${ result . path } ${ result . query || "" } ${ result . fragment || "" } ` ,
234248 result
235249 ) ;
236250 } ;
@@ -363,23 +377,28 @@ class Resolver {
363377 }
364378 }
365379
380+ /**
381+ * @param {string } identifier identifier
382+ * @returns {ParsedIdentifier } parsed identifier
383+ */
366384 parse ( identifier ) {
367385 const part = {
368386 request : "" ,
369387 query : "" ,
388+ fragment : "" ,
370389 module : false ,
371390 directory : false ,
372391 file : false
373392 } ;
374- const idxQuery = identifier . indexOf ( "?" ) ;
375- if ( idxQuery === 0 ) {
376- part . query = identifier ;
377- } else if ( idxQuery > 0 ) {
378- part . request = identifier . slice ( 0 , idxQuery ) ;
379- part . query = identifier . slice ( idxQuery ) ;
380- } else {
381- part . request = identifier ;
382- }
393+
394+ const match = / ^ ( [ ^ ? # ] * ) ( \? [ ^ # ] * ) ? ( # . * ) ? $ / . exec ( identifier ) ;
395+
396+ if ( ! match ) return part ;
397+
398+ part . request = match [ 1 ] || "" ;
399+ part . query = match [ 2 ] || "" ;
400+ part . fragment = match [ 3 ] || "" ;
401+
383402 if ( part . request ) {
384403 part . module = this . isModule ( part . request ) ;
385404 part . directory = this . isDirectory ( part . request ) ;
0 commit comments