@@ -19,6 +19,42 @@ describe('createNsMRequestContext', () => {
1919 expect ( result . value . bootTaggedRequest ) . toBe ( false ) ;
2020 } ) ;
2121
22+ it ( 'decodes percent-encoded pathname specs (device-encoded bracketed files)' , ( ) => {
23+ const encoded = createNsMRequestContext ( '/ns/m/packages/app/src/app/demo/%5Bid%5D.tsrx?import' , '/workspace' , '/src/' ) ;
24+ const raw = createNsMRequestContext ( '/ns/m/packages/app/src/app/demo/[id].tsrx?import' , '/workspace' , '/src/' ) ;
25+
26+ expect ( encoded . kind ) . toBe ( 'context' ) ;
27+ expect ( raw . kind ) . toBe ( 'context' ) ;
28+ if ( encoded . kind !== 'context' || raw . kind !== 'context' ) {
29+ return ;
30+ }
31+
32+ expect ( encoded . value . spec ) . toBe ( '/packages/app/src/app/demo/[id].tsrx' ) ;
33+ expect ( encoded . value . spec ) . toBe ( raw . value . spec ) ;
34+ } ) ;
35+
36+ it ( 'does not double-decode the already-decoded ?path= spec' , ( ) => {
37+ const result = createNsMRequestContext ( '/ns/m/?path=/app/demo/%255Bid%255D.tsrx' , '/workspace' , '/src/' ) ;
38+
39+ expect ( result . kind ) . toBe ( 'context' ) ;
40+ if ( result . kind !== 'context' ) {
41+ return ;
42+ }
43+
44+ expect ( result . value . spec ) . toBe ( '/app/demo/%5Bid%5D.tsrx' ) ;
45+ } ) ;
46+
47+ it ( 'leaves encoded reserved characters encoded, matching Vite' , ( ) => {
48+ const result = createNsMRequestContext ( '/ns/m/app/a%3Fb%23c%2Fd.ts' , '/workspace' , '/src/' ) ;
49+
50+ expect ( result . kind ) . toBe ( 'context' ) ;
51+ if ( result . kind !== 'context' ) {
52+ return ;
53+ }
54+
55+ expect ( result . value . spec ) . toBe ( '/app/a%3Fb%23c%2Fd.ts' ) ;
56+ } ) ;
57+
2258 it ( 'returns a response module for blocked build-time node_modules imports' , ( ) => {
2359 const result = createNsMRequestContext ( '/ns/m/node_modules/vite/dist/index.js' , '/workspace' , '/src/' ) ;
2460
0 commit comments