@@ -69,19 +69,6 @@ const parseNamedImports = (bindings) => {
6969 return parts ;
7070} ;
7171
72- const ensureImportEntry = ( importRegistry , specifier ) => {
73- if ( importRegistry . has ( specifier ) ) return importRegistry . get ( specifier ) ;
74-
75- const entry = {
76- defaultNames : new Set ( ) ,
77- named : new Set ( ) ,
78- isSideEffect : false ,
79- } ;
80- importRegistry . set ( specifier , entry ) ;
81-
82- return entry ;
83- } ;
84-
8572const isValidSpecifier = ( specifier , filename , importStatement ) => {
8673 if ( specifier . startsWith ( 'node:' ) || NODE_BUILTINS . has ( specifier ) ) {
8774 console . error (
@@ -106,7 +93,14 @@ const processImports = (content, filename, importRegistry) => {
10693 const { specifier, defaultName, namedImports } = groups ;
10794
10895 if ( isValidSpecifier ( specifier , filename , match ) ) {
109- const entry = ensureImportEntry ( importRegistry , specifier ) ;
96+ if ( ! importRegistry . has ( specifier ) ) {
97+ importRegistry . set ( specifier , {
98+ defaultNames : new Set ( ) ,
99+ named : new Set ( ) ,
100+ isSideEffect : false ,
101+ } ) ;
102+ }
103+ const entry = importRegistry . get ( specifier ) ;
110104
111105 if ( pattern . type === 'default' ) {
112106 entry . defaultNames . add ( defaultName ) ;
@@ -124,49 +118,31 @@ const processImports = (content, filename, importRegistry) => {
124118 return result ;
125119} ;
126120
121+ const generateEntryStatements = (
122+ specifier ,
123+ { isSideEffect, defaultNames, named } ,
124+ ) => {
125+ const namedParts = Array . from ( named ) ;
126+ const sideEffect = isSideEffect ? [ `import '${ specifier } ';` ] : [ ] ;
127+ const defaultStmts = Array . from ( defaultNames ) . map (
128+ ( name ) => `import ${ name } from '${ specifier } ';` ,
129+ ) ;
130+ const namedStmt =
131+ namedParts . length > 0
132+ ? [ `import { ${ namedParts . join ( ', ' ) } } from '${ specifier } ';` ]
133+ : [ ] ;
134+ return [ ...sideEffect , ...defaultStmts , ...namedStmt ] ;
135+ } ;
136+
127137const generateImportStatements = ( importRegistry ) => {
128138 if ( importRegistry . size === 0 ) return '' ;
129- const importStatements = [ ] ;
130-
131- for ( const [ depName , entry ] of importRegistry . entries ( ) ) {
132- const specifier = `./${ depName } .js` ;
133- const { isSideEffect, defaultNames, named } = entry ;
134-
135- if ( isSideEffect ) importStatements . push ( `import '${ specifier } ';` ) ;
136-
137- const namedParts = Array . from ( named ) ;
138-
139- if ( defaultNames . size === 0 && namedParts . length === 0 ) continue ;
140-
141- // when different files import the same module with different default names
142- if ( defaultNames . size > 1 ) {
143- // respect each defaultName to not break concatenated code
144- for ( const defaultName of defaultNames ) {
145- importStatements . push ( `import ${ defaultName } from '${ specifier } ';` ) ;
146- }
147- if ( namedParts . length > 0 ) {
148- importStatements . push (
149- `import { ${ namedParts . join ( ', ' ) } } from '${ specifier } ';` ,
150- ) ;
151- }
152- continue ;
153- }
154-
155- const [ defaultName ] = defaultNames ;
156- let stmt ;
157- if ( defaultName && namedParts . length > 0 ) {
158- stmt =
159- `import ${ defaultName } , { ${ namedParts . join ( ', ' ) } } ` +
160- `from '${ specifier } ';` ;
161- } else if ( defaultName ) {
162- stmt = `import ${ defaultName } from '${ specifier } ';` ;
163- } else {
164- stmt = `import { ${ namedParts . join ( ', ' ) } } from '${ specifier } ';` ;
165- }
166- importStatements . push ( stmt ) ;
167- }
168-
169- return importStatements . join ( '\n' ) + '\n\n' ;
139+ return (
140+ Array . from ( importRegistry . entries ( ) )
141+ . flatMap ( ( [ depName , entry ] ) =>
142+ generateEntryStatements ( `./${ depName } .js` , entry ) ,
143+ )
144+ . join ( '\n' ) + '\n\n'
145+ ) ;
170146} ;
171147
172148module . exports = {
0 commit comments