@@ -76,6 +76,7 @@ SOFTWARE.
7676 const ERR = Error ;
7777 const CONSOLE = console ;
7878 const MAP = Map ;
79+ const BLOB = isBrowser ? Blob : null ;
7980
8081 JUSTC . VERSION = null ;
8182 JUSTC . GetVersion = function ( ) {
@@ -105,7 +106,7 @@ SOFTWARE.
105106 } ;
106107
107108 if ( isBrowser ) {
108- JUSTC . Checks . sysFunc ( OBJECT , ARRAY , __URL__ , STRING , ERR , MAP ) ;
109+ JUSTC . Checks . sysFunc ( OBJECT , ARRAY , __URL__ , STRING , ERR , MAP , BLOB ) ;
109110 JUSTC . Checks . sysObj ( json_ , CONSOLE ) ;
110111 JUSTC . Checks . sysObj ( globalThis_ , DOCUMENT ) ;
111112 JUSTC . Checks . sysFunc (
@@ -398,6 +399,55 @@ SOFTWARE.
398399 'json' , 'xml' , 'yaml'
399400 ] ;
400401
402+ JUSTC . VFS = isBrowser ? class VirtualFileSystem {
403+ constructor ( ) {
404+ this . files = new MAP ( ) ;
405+ }
406+
407+ createFile ( filename , content , options = { } ) {
408+ const {
409+ mimeType = 'text/plain' ,
410+ language = 'text' ,
411+ syntaxHighlighting = true
412+ } = options ;
413+
414+ this . files . set ( filename , { content, mimeType, language } ) ;
415+
416+ if ( syntaxHighlighting ) {
417+ this . _registerFileInDevTools ( filename , content , language ) ;
418+ }
419+
420+ return filename ;
421+ }
422+
423+ _registerFileInDevTools ( filename , content , language ) {
424+ const blob = new BLOB ( [ content ] , { type : 'text/plain' } ) ;
425+ const url = __URL__ . createObjectURL ( blob ) ;
426+
427+ const script = DOCUMENT . createElement ( 'script' ) ;
428+ script . textContent = `//# sourceMappingURL=data:application/json;base64,${ btoa ( JSON . stringify ( {
429+ version : 3 ,
430+ file : filename ,
431+ sources : [ filename ] ,
432+ sourcesContent : [ content ] ,
433+ mappings : ""
434+ } ) ) } `;
435+
436+ DOCUMENT . head . appendChild ( script ) ;
437+ DOCUMENT . head . removeChild ( script ) ;
438+ __URL__ . revokeObjectURL ( url ) ;
439+ }
440+
441+ getFile ( filename ) {
442+ return this . files . get ( filename ) ;
443+ }
444+
445+ listFiles ( ) {
446+ return ARRAY . from ( this . files . keys ( ) ) ;
447+ }
448+ } : undefined ;
449+ JUSTC . CurrentVFS = isBrowser ? new JUSTC . VFS ( ) : undefined ;
450+
401451 JUSTC . Check = ( code ) => {
402452 if ( JUSTC . CheckInput ( code ) ) throw new JUSTC . Error ( JUSTC . Errors . wrongInputType ) ;
403453 JUSTC . CheckWASM ( ) ;
@@ -435,6 +485,15 @@ SOFTWARE.
435485 } ;
436486 return await Promise . all ( await Promise . all ( JUSTC . Taskify ( bool , outputMode , args . slice ( start , end ) ) ) )
437487 } ;
488+ JUSTC . RegisterImports = function ( imports ) {
489+ if ( isBrowser && imports && ARRAY . isArray ( imports ) && imports . length > 0 ) setTimeout ( ( ) => {
490+ try {
491+ for ( const [ url , content , type ] of imports ) {
492+ JUSTC . CurrentVFS . createFile ( url , content , { mimeType : type } ) ;
493+ }
494+ } catch ( _ ) { }
495+ } , 0 ) ;
496+ } ;
438497 JUSTC . Output = {
439498 parse : isBrowser || ! JUSTC . Experiments ? function ( code , outputMode = JUSTC . DefaultOutputMode ) {
440499 JUSTC . Check ( code ) ;
@@ -444,6 +503,7 @@ SOFTWARE.
444503 if ( result . error ) {
445504 throw new JUSTC . Error ( result . error ) ;
446505 } else {
506+ JUSTC . RegisterImports ( result . imported ) ;
447507 return result . return || { } ;
448508 }
449509 } : async function ( ...code ) {
@@ -457,6 +517,7 @@ SOFTWARE.
457517 if ( result . error ) {
458518 throw new JUSTC . Error ( result . error ) ;
459519 } else {
520+ JUSTC . RegisterImports ( result . imported ) ;
460521 JUSTC . DisplayLogs ( result ) ;
461522 return result . return || { } ;
462523 }
0 commit comments