@@ -13,8 +13,8 @@ interface File {
1313}
1414
1515interface Directory {
16- directories : { [ key : string ] : Directory } ;
17- files : { [ key : string ] : File } ;
16+ directories : Map < string , Directory > ;
17+ files : Map < string , File > ;
1818 isWildcard : boolean ;
1919 name : string ;
2020 rawName : string ;
@@ -34,8 +34,8 @@ function isDirectory(test: Directory | undefined): test is Directory {
3434
3535export class ModuleTree {
3636 public readonly root : Directory = {
37- directories : { } ,
38- files : { } ,
37+ directories : new Map ( ) ,
38+ files : new Map ( ) ,
3939 isWildcard : false ,
4040 name : "" ,
4141 rawName : "" ,
@@ -52,20 +52,25 @@ export class ModuleTree {
5252 return directory ;
5353 }
5454
55- const isNewDirectory =
56- directory . directories [ segment . toLowerCase ( ) ] === undefined ;
55+ const isNewDirectory = ! directory . directories . has ( segment . toLowerCase ( ) ) ;
5756
58- const nextDirectory = ( directory . directories [ segment . toLowerCase ( ) ] ??= {
59- directories : { } ,
60- files : { } ,
61- isWildcard : segment . startsWith ( "{" ) ,
62- name : segment . replace ( / ^ \{ (?< name > .* ) \} $ / u, "$<name>" ) ,
63- rawName : segment ,
64- } ) ;
57+ if ( isNewDirectory ) {
58+ directory . directories . set ( segment . toLowerCase ( ) , {
59+ directories : new Map ( ) ,
60+ files : new Map ( ) ,
61+ isWildcard : segment . startsWith ( "{" ) ,
62+ name : segment . replace ( / ^ \{ (?< name > .* ) \} $ / u, "$<name>" ) ,
63+ rawName : segment ,
64+ } ) ;
65+ }
66+
67+ const nextDirectory = directory . directories . get (
68+ segment . toLowerCase ( ) ,
69+ ) as Directory ;
6570
6671 if ( isNewDirectory && segment . startsWith ( "{" ) ) {
67- const ambiguousWildcardDirectories = Object . values (
68- directory . directories ,
72+ const ambiguousWildcardDirectories = Array . from (
73+ directory . directories . values ( ) ,
6974 ) . filter ( ( subdirectory ) => subdirectory . isWildcard ) ;
7075
7176 if ( ambiguousWildcardDirectories . length > 1 ) {
@@ -97,16 +102,16 @@ export class ModuleTree {
97102 ) ;
98103 }
99104
100- targetDirectory . files [ filename ] = {
105+ targetDirectory . files . set ( filename , {
101106 isWildcard : filename . startsWith ( "{" ) ,
102107 module,
103108 name : filename . replace ( / ^ \{ (?< name > .* ) \} $ / u, "$<name>" ) ,
104109 rawName : filename ,
105- } ;
110+ } ) ;
106111
107112 if ( filename . startsWith ( "{" ) ) {
108- const ambiguousWildcardFiles = Object . values (
109- targetDirectory . files ,
113+ const ambiguousWildcardFiles = Array . from (
114+ targetDirectory . files . values ( ) ,
110115 ) . filter ( ( file ) => file . isWildcard ) ;
111116
112117 if ( ambiguousWildcardFiles . length > 1 ) {
@@ -136,13 +141,13 @@ export class ModuleTree {
136141 }
137142
138143 if ( remainingSegments . length === 0 ) {
139- delete directory . files [ segment . toLowerCase ( ) ] ;
144+ directory . files . delete ( segment . toLowerCase ( ) ) ;
140145
141146 return ;
142147 }
143148
144149 this . removeModuleFromDirectory (
145- directory . directories [ segment . toLowerCase ( ) ] ,
150+ directory . directories . get ( segment . toLowerCase ( ) ) ,
146151 remainingSegments ,
147152 ) ;
148153 }
@@ -165,16 +170,17 @@ export class ModuleTree {
165170 method : string ,
166171 ) : Match | undefined {
167172 function normalizedSegment ( segment : string , directory : Directory ) {
168- for ( const file in directory . files ) {
173+ for ( const file of directory . files . keys ( ) ) {
169174 if ( file . toLowerCase ( ) === segment . toLowerCase ( ) ) {
170175 return file ;
171176 }
172177 }
173178 return "" ;
174179 }
175180
176- const exactMatchFile =
177- directory . files [ normalizedSegment ( segment , directory ) ] ;
181+ const exactMatchFile = directory . files . get (
182+ normalizedSegment ( segment , directory ) ,
183+ ) ;
178184
179185 // If the URL segment literally matches a file key (e.g., requesting "/{x}"
180186 // as a literal URL value), exactMatchFile may be a wildcard file. In that
@@ -187,7 +193,7 @@ export class ModuleTree {
187193 } ;
188194 }
189195
190- const wildcardFiles = Object . values ( directory . files ) . filter (
196+ const wildcardFiles = Array . from ( directory . files . values ( ) ) . filter (
191197 ( file ) => file . isWildcard && this . fileModuleDefined ( file , method ) ,
192198 ) ;
193199
@@ -265,7 +271,7 @@ export class ModuleTree {
265271 ) ;
266272 }
267273
268- const exactMatch = directory . directories [ segment . toLowerCase ( ) ] ;
274+ const exactMatch = directory . directories . get ( segment . toLowerCase ( ) ) ;
269275
270276 if ( isDirectory ( exactMatch ) ) {
271277 return this . matchWithinDirectory (
@@ -277,9 +283,9 @@ export class ModuleTree {
277283 ) ;
278284 }
279285
280- const wildcardDirectories = Object . values ( directory . directories ) . filter (
281- ( subdirectory ) => subdirectory . isWildcard ,
282- ) ;
286+ const wildcardDirectories = Array . from (
287+ directory . directories . values ( ) ,
288+ ) . filter ( ( subdirectory ) => subdirectory . isWildcard ) ;
283289
284290 const wildcardMatches : Match [ ] = [ ] ;
285291
@@ -323,11 +329,11 @@ export class ModuleTree {
323329 const routes : Route [ ] = [ ] ;
324330
325331 function traverse ( directory : Directory , path : string ) {
326- Object . values ( directory . directories ) . forEach ( ( subdirectory ) => {
332+ directory . directories . forEach ( ( subdirectory ) => {
327333 traverse ( subdirectory , `${ path } /${ subdirectory . rawName } ` ) ;
328334 } ) ;
329335
330- Object . values ( directory . files ) . forEach ( ( file ) => {
336+ directory . files . forEach ( ( file ) => {
331337 const methods : [ string , string ] [ ] = Object . entries ( file . module ) . map (
332338 ( [ method , implementation ] ) => [ method , String ( implementation ) ] ,
333339 ) ;
0 commit comments