11const log = require ( "@ui5/logger" ) . getLogger ( "resources:adapters:AbstractAdapter" ) ;
22const minimatch = require ( "minimatch" ) ;
33const AbstractReaderWriter = require ( "../AbstractReaderWriter" ) ;
4+ const Resource = require ( "../Resource" ) ;
45
56/**
67 * Abstract Resource Adapter
@@ -49,6 +50,25 @@ class AbstractAdapter extends AbstractReaderWriter {
4950 return [ ] ;
5051 }
5152 patterns = Array . prototype . concat . apply ( [ ] , patterns ) ;
53+ if ( ! options . nodir ) {
54+ for ( let i = patterns . length - 1 ; i >= 0 ; i -- ) {
55+ const idx = this . _virBaseDir . indexOf ( patterns [ i ] ) ;
56+ if ( patterns [ i ] && idx !== - 1 && idx < this . _virBaseDir . length ) {
57+ const subPath = patterns [ i ] ;
58+ return Promise . resolve ( [
59+ new Resource ( {
60+ project : this . project ,
61+ statInfo : { // TODO: make closer to fs stat info
62+ isDirectory : function ( ) {
63+ return true ;
64+ }
65+ } ,
66+ path : subPath
67+ } )
68+ ] ) ;
69+ }
70+ }
71+ }
5272 return this . _runGlob ( patterns , options , trace ) ;
5373 } ) ;
5474 }
@@ -62,6 +82,7 @@ class AbstractAdapter extends AbstractReaderWriter {
6282 */
6383 _normalizePattern ( virPattern ) {
6484 return Promise . resolve ( ) . then ( ( ) => {
85+ const that = this ;
6586 const mm = new minimatch . Minimatch ( virPattern ) ;
6687
6788 const basePathParts = this . _virBaseDir . split ( "/" ) ;
@@ -71,41 +92,50 @@ class AbstractAdapter extends AbstractReaderWriter {
7192 for ( i = 0 ; i < basePathParts . length ; i ++ ) {
7293 const globPart = subset [ i ] ;
7394 if ( globPart === undefined ) {
74- log . verbose ( "Ran out of glob parts to match. This should not happen." ) ;
75- return - 42 ;
95+ log . verbose ( "Ran out of glob parts to match (this should not happen):" ) ;
96+ if ( that . _project ) { // project is optional
97+ log . verbose ( `Project: ${ that . _project . metadata . name } ` ) ;
98+ }
99+ log . verbose ( `Virtual base path: ${ that . _virBaseDir } ` ) ;
100+ log . verbose ( `Pattern to match: ${ virPattern } ` ) ;
101+ log . verbose ( `Current subset (tried index ${ i } ):` ) ;
102+ log . verbose ( subset ) ;
103+ return { idx : i , virtualMatch : true } ;
76104 }
77105 const basePathPart = basePathParts [ i ] ;
78106 if ( typeof globPart === "string" ) {
79107 if ( globPart !== basePathPart ) {
80- return - 42 ;
108+ return null ;
81109 } else {
82110 continue ;
83111 }
84112 } else if ( globPart === minimatch . GLOBSTAR ) {
85113 return i ;
86114 } else { // Regex
87115 if ( ! globPart . test ( basePathPart ) ) {
88- return - 42 ;
116+ return null ;
89117 } else {
90118 continue ;
91119 }
92120 }
93121 }
94122 if ( subset . length === basePathParts . length ) {
95- return - 1 ;
123+ return { rootMatch : true } ;
96124 }
97- return i ;
125+ return { idx : i } ;
98126 }
99127
100128 const resultGlobs = [ ] ;
101129 for ( let i = 0 ; i < mm . set . length ; i ++ ) {
102- const matchIdx = matchSubset ( mm . set [ i ] ) ;
103- let resultPattern ;
104- if ( matchIdx !== - 42 ) {
105- if ( matchIdx === - 1 ) { // matched one up
130+ const match = matchSubset ( mm . set [ i ] ) ;
131+ if ( match ) {
132+ let resultPattern ;
133+ if ( match . virtualMatch ) {
134+ resultPattern = basePathParts . slice ( 0 , match . idx ) . join ( "/" ) ;
135+ } else if ( match . rootMatch ) { // matched one up
106136 resultPattern = "" ; // root "/"
107137 } else { // matched at some part of the glob
108- resultPattern = mm . globParts [ i ] . slice ( matchIdx ) . join ( "/" ) ;
138+ resultPattern = mm . globParts [ i ] . slice ( match . idx ) . join ( "/" ) ;
109139 if ( resultPattern . startsWith ( "/" ) ) {
110140 resultPattern = resultPattern . substr ( 1 ) ;
111141 }
0 commit comments