@@ -617,6 +617,32 @@ export async function shellWithDocker(): Promise<vscode.Terminal> {
617617 return terminal ;
618618}
619619
620+ interface WSServerRootFolderData {
621+ redirectDotvscode : boolean ;
622+ }
623+
624+ const wsServerRootFolders = new Map < string , WSServerRootFolderData > ( ) ;
625+
626+ /**
627+ * Add uri to the wsServerRootFolders map if eligible
628+ */
629+ export async function addWsServerRootFolderData ( uri : vscode . Uri ) : Promise < void > {
630+ if ( ! schemas . includes ( uri . scheme ) ) {
631+ return ;
632+ }
633+ const value : WSServerRootFolderData = {
634+ redirectDotvscode : true ,
635+ } ;
636+ if ( isCSPFile ( uri ) ) {
637+ // A CSP-type root folder that already has a .vscode/settings.json file must not redirect .vscode/* references
638+ const api = new AtelierAPI ( uri ) ;
639+ api . getDoc ( `${ uri . path } /.vscode/settings.json` ) . then ( ( ) => {
640+ value . redirectDotvscode = false ;
641+ } ) ;
642+ }
643+ wsServerRootFolders . set ( uri . toString ( ) , value ) ;
644+ }
645+
620646/**
621647 * Alter isfs-type uri.path of /.vscode/* files or subdirectories.
622648 * Rewrite `/.vscode/path/to/file` as `/_vscode/XYZ/path/to/file`
@@ -633,13 +659,18 @@ export function redirectDotvscodeRoot(uri: vscode.Uri): vscode.Uri {
633659 if ( ! schemas . includes ( uri . scheme ) ) {
634660 return uri ;
635661 }
636- const dotMatch = uri . path . match ( / ^ \/ ( \. [ ^ / ] * ) ( \/ .* ) ? $ / ) ;
637- if ( dotMatch && dotMatch [ 1 ] === ".vscode" ) {
662+ const dotMatch = uri . path . match ( / ^ ( .* ) \/ \. v s c o d e ( \/ .* ) ? $ / ) ;
663+ if ( dotMatch ) {
664+ const dotvscodeRoot = uri . with ( { path : dotMatch [ 1 ] || "/" } ) ;
665+ if ( ! wsServerRootFolders . get ( dotvscodeRoot . toString ( ) ) ?. redirectDotvscode ) {
666+ return uri ;
667+ }
638668 let namespace : string ;
669+ const andCSP = ! isCSPFile ( uri ) ? "&csp" : "" ;
639670 const nsMatch = `&${ uri . query } &` . match ( / & n s = ( [ ^ & ] + ) & / ) ;
640671 if ( nsMatch ) {
641672 namespace = nsMatch [ 1 ] . toUpperCase ( ) ;
642- const newQueryString = ( ( "&" + uri . query ) . replace ( `ns=${ namespace } ` , "ns=%SYS" ) + "&csp" ) . slice ( 1 ) ;
673+ const newQueryString = ( ( "&" + uri . query ) . replace ( `ns=${ namespace } ` , "ns=%SYS" ) + andCSP ) . slice ( 1 ) ;
643674 return uri . with ( { path : `/_vscode/${ namespace } ${ dotMatch [ 2 ] || "" } ` , query : newQueryString } ) ;
644675 } else {
645676 const parts = uri . authority . split ( ":" ) ;
@@ -648,7 +679,7 @@ export function redirectDotvscodeRoot(uri: vscode.Uri): vscode.Uri {
648679 return uri . with ( {
649680 authority : `${ parts [ 0 ] } :%SYS` ,
650681 path : `/_vscode/${ namespace } ${ dotMatch [ 2 ] || "" } ` ,
651- query : uri . query + "&csp" ,
682+ query : uri . query + andCSP ,
652683 } ) ;
653684 }
654685 }
0 commit comments