@@ -9,18 +9,18 @@ var module$1 = require('module');
99var cancellation = require ( '@jsenv/cancellation' ) ;
1010
1111const memoizeAsyncFunctionByUrl = fn => {
12- const map = new WeakMap ( ) ;
12+ const cache = { } ;
1313 return memoizeAsyncFunction ( fn , {
1414 getMemoryEntryFromArguments : ( [ url ] ) => {
1515 return {
1616 get : ( ) => {
17- return map . get ( url ) ;
17+ return cache [ url ] ;
1818 } ,
1919 set : promise => {
20- map . set ( url , promise ) ;
20+ cache [ url ] = promise ;
2121 } ,
2222 delete : ( ) => {
23- map . delete ( url ) ;
23+ delete cache [ url ] ;
2424 }
2525 } ;
2626 }
@@ -61,7 +61,7 @@ const memoizeAsyncFunctionBySpecifierAndImporter = fn => {
6161const memoizeAsyncFunction = ( fn , {
6262 getMemoryEntryFromArguments
6363} ) => {
64- return async ( ...args ) => {
64+ const memoized = async ( ...args ) => {
6565 const memoryEntry = getMemoryEntryFromArguments ( args ) ;
6666 const promiseFromMemory = memoryEntry . get ( ) ;
6767
@@ -95,6 +95,12 @@ const memoizeAsyncFunction = (fn, {
9595
9696 return promise ;
9797 } ;
98+
99+ memoized . isInMemory = ( ...args ) => {
100+ return Boolean ( getMemoryEntryFromArguments ( args ) . get ( ) ) ;
101+ } ;
102+
103+ return memoized ;
98104} ;
99105
100106const createControllablePromise = ( ) => {
@@ -537,6 +543,15 @@ const getImportMapFromJsFiles = async ({
537543 scope,
538544 from
539545 } ) => {
546+ if ( scope ) {
547+ // make scope relative again
548+ scope = `./${ util . urlToRelativeUrl ( scope , projectDirectoryUrl ) } ` ; // make from relative again
549+
550+ if ( from . startsWith ( projectDirectoryUrl ) ) {
551+ from = `./${ util . urlToRelativeUrl ( from , projectDirectoryUrl ) } ` ;
552+ }
553+ }
554+
540555 markMappingAsUsed ( {
541556 scope,
542557 from,
@@ -547,7 +562,7 @@ const getImportMapFromJsFiles = async ({
547562 } ) ;
548563 } ;
549564
550- const visitFile = async ( specifier , importer , {
565+ const resolveFileSystemUrl = memoizeAsyncFunctionBySpecifierAndImporter ( async ( specifier , importer , {
551566 importedBy
552567 } ) => {
553568 let fileUrl ;
@@ -563,7 +578,7 @@ const getImportMapFromJsFiles = async ({
563578 if ( importer === projectPackageFileUrl ) {
564579 // cannot find package main file (package.main is "" for instance)
565580 // we can't discover main file and parse dependencies
566- return ;
581+ return null ;
567582 }
568583
569584 gotBareSpecifierError = true ;
@@ -581,7 +596,7 @@ const getImportMapFromJsFiles = async ({
581596 fileUrl,
582597 magicExtensions
583598 } ) ) ;
584- return ;
599+ return null ;
585600 }
586601
587602 const needsAutoMapping = fileUrlOnFileSystem !== fileUrl || gotBareSpecifierError ;
@@ -607,39 +622,45 @@ const getImportMapFromJsFiles = async ({
607622 } ) ) ;
608623 }
609624
610- await visitFileContent ( fileUrlOnFileSystem ) ;
611- } ;
612-
613- const visitFileContent = memoizeAsyncFunctionByUrl ( async fileUrl => {
614- const fileContent = await readFileContent ( fileUrl ) ;
625+ return fileUrlOnFileSystem ;
626+ } ) ;
627+ const visitFile = memoizeAsyncFunctionByUrl ( async fileUrl => {
628+ const fileContent = await util . readFile ( fileUrl , {
629+ as : "string"
630+ } ) ;
615631 const specifiers = await parseSpecifiersFromFile ( fileUrl , {
616632 fileContent
617633 } ) ;
618- await Promise . all ( Object . keys ( specifiers ) . map ( async specifier => {
634+ const dependencies = await Promise . all ( Object . keys ( specifiers ) . map ( async specifier => {
619635 const specifierInfo = specifiers [ specifier ] ;
620- await visitFileMemoized ( specifier , fileUrl , {
636+ const dependencyUrlOnFileSystem = await resolveFileSystemUrl ( specifier , fileUrl , {
621637 importedBy : showSource ( {
622638 url : fileUrl ,
623639 line : specifierInfo . line ,
624640 column : specifierInfo . column ,
625641 source : fileContent
626642 } )
627643 } ) ;
644+ return dependencyUrlOnFileSystem ;
628645 } ) ) ;
629- } ) ;
630- const visitFileMemoized = memoizeAsyncFunctionBySpecifierAndImporter ( visitFile ) ;
631- const readFileContent = memoizeAsyncFunctionByUrl ( fileUrl => {
632- return util . readFile ( fileUrl , {
633- as : "string"
646+ const dependenciesToVisit = dependencies . filter ( dependency => {
647+ return dependency && ! visitFile . isInMemory ( dependency ) ;
634648 } ) ;
649+ await Promise . all ( dependenciesToVisit . map ( dependency => {
650+ return visitFile ( dependency ) ;
651+ } ) ) ;
635652 } ) ;
636653 const projectPackageObject = await util . readFile ( projectPackageFileUrl , {
637654 as : "json"
638655 } ) ;
639- await visitFileMemoized ( projectPackageObject . name , projectPackageFileUrl , {
656+ const projectMainFileUrlOnFileSystem = await resolveFileSystemUrl ( projectPackageObject . name , projectPackageFileUrl , {
640657 importedBy : projectPackageObject . exports ? `${ projectPackageFileUrl } #exports` : `${ projectPackageFileUrl } `
641658 } ) ;
642659
660+ if ( projectMainFileUrlOnFileSystem ) {
661+ await visitFile ( projectMainFileUrlOnFileSystem ) ;
662+ }
663+
643664 if ( removeUnusedMappings ) {
644665 const importsUsed = { } ;
645666 topLevelMappingsUsed . forEach ( ( {
@@ -660,16 +681,16 @@ const getImportMapFromJsFiles = async ({
660681 } ) ;
661682 scopesUsed [ scope ] = scopedMappings ;
662683 } ) ;
663- return {
684+ return importMap . sortImportMap ( {
664685 imports : importsUsed ,
665686 scopes : scopesUsed
666- } ;
687+ } ) ;
667688 }
668689
669- return {
690+ return importMap . sortImportMap ( importMap . composeTwoImportMaps ( importMap$1 , {
670691 imports,
671692 scopes
672- } ;
693+ } ) ) ;
673694} ;
674695
675696const packageDirectoryUrlFromUrl = ( url , projectDirectoryUrl ) => {
@@ -2064,18 +2085,22 @@ const getImportMapFromProjectFiles = async ({
20642085 ...rest
20652086 } ) ;
20662087 importMapFromPackageFiles = importMap . sortImportMap ( importMapFromPackageFiles ) ;
2067- let importMapFromJsFiles = jsFiles ? await getImportMapFromJsFiles ( {
2068- logLevel,
2088+
2089+ if ( ! jsFiles ) {
2090+ return importMapFromPackageFiles ;
2091+ }
2092+
2093+ let importMapFromJsFiles = await getImportMapFromJsFiles ( {
20692094 warn,
20702095 importMap : importMapFromPackageFiles ,
20712096 removeUnusedMappings,
20722097 projectDirectoryUrl,
20732098 magicExtensions,
20742099 packagesExportsPreference,
20752100 runtime
2076- } ) : { } ;
2101+ } ) ;
20772102 importMapFromJsFiles = importMap . sortImportMap ( importMapFromJsFiles ) ;
2078- return importMap . sortImportMap ( importMap . composeTwoImportMaps ( importMapFromPackageFiles , importMapFromJsFiles ) ) ;
2103+ return importMapFromJsFiles ;
20792104} ;
20802105const runtimeExportsPreferences = {
20812106 browser : [ "browser" ] ,
0 commit comments