@@ -90,39 +90,64 @@ module.exports = function (babel) {
9090 Program ( path , state ) {
9191 let options = state . opts || { } ;
9292 let useEmberModule = Boolean ( options . useEmberModule ) ;
93+ let allAddedImports = { } ;
9394
94- let preexistingEmberImportDeclaration = path
95- . get ( 'body' )
96- . filter ( ( n ) => n . type === 'ImportDeclaration' )
97- . find ( ( n ) => n . get ( 'source' ) . get ( 'value' ) . node === 'ember' ) ;
98-
99- if (
100- // an import was found
101- preexistingEmberImportDeclaration &&
102- // this accounts for `import from 'ember'` without a local identifier
103- preexistingEmberImportDeclaration . node . specifiers . length > 0
104- ) {
105- state . emberIdentifier =
106- preexistingEmberImportDeclaration . node . specifiers [ 0 ] . local ;
107- }
95+ state . ensureImport = ( exportName , moduleName ) => {
96+ let addedImports = ( allAddedImports [ moduleName ] =
97+ allAddedImports [ moduleName ] || { } ) ;
10898
109- state . ensureEmberImport = ( ) => {
110- if ( ! useEmberModule ) {
111- // ensures that we can always assume `state.emberIdentifier` is set
112- state . emberIdentifier = t . identifier ( 'Ember' ) ;
113- return ;
114- }
99+ if ( addedImports [ exportName ] ) return addedImports [ exportName ] ;
115100
116- if ( state . emberIdentifier ) return ;
101+ if (
102+ exportName === 'default' &&
103+ moduleName === 'ember' &&
104+ ! useEmberModule
105+ ) {
106+ addedImports [ exportName ] = t . identifier ( 'Ember' ) ;
107+ return addedImports [ exportName ] ;
108+ }
117109
118- state . emberIdentifier = path . scope . generateUidIdentifier ( 'Ember' ) ;
110+ let importDeclarations = path
111+ . get ( 'body' )
112+ . filter ( ( n ) => n . type === 'ImportDeclaration' ) ;
119113
120- let emberImport = t . importDeclaration (
121- [ t . importDefaultSpecifier ( state . emberIdentifier ) ] ,
122- t . stringLiteral ( 'ember' )
114+ let preexistingImportDeclaration = importDeclarations . find (
115+ ( n ) => n . get ( 'source' ) . get ( 'value' ) . node === moduleName
123116 ) ;
124117
125- path . unshiftContainer ( 'body' , emberImport ) ;
118+ if ( preexistingImportDeclaration ) {
119+ let importSpecifier = preexistingImportDeclaration
120+ . get ( 'specifiers' )
121+ . find ( ( { node } ) => {
122+ return exportName === 'default'
123+ ? t . isImportDefaultSpecifier ( node )
124+ : node . imported . name === exportName ;
125+ } ) ;
126+
127+ if ( importSpecifier ) {
128+ addedImports [ exportName ] = importSpecifier . node . local ;
129+ }
130+ }
131+
132+ if ( ! addedImports [ exportName ] ) {
133+ let uid = path . scope . generateUidIdentifier (
134+ exportName === 'default' ? moduleName : exportName
135+ ) ;
136+ addedImports [ exportName ] = uid ;
137+
138+ let newImportSpecifier =
139+ exportName === 'default'
140+ ? t . importDefaultSpecifier ( uid )
141+ : t . importSpecifier ( uid , t . identifier ( exportName ) ) ;
142+
143+ let newImport = t . importDeclaration (
144+ [ newImportSpecifier ] ,
145+ t . stringLiteral ( moduleName )
146+ ) ;
147+ path . unshiftContainer ( 'body' , newImport ) ;
148+ }
149+
150+ return addedImports [ exportName ] ;
126151 } ;
127152 } ,
128153
@@ -216,9 +241,6 @@ module.exports = function (babel) {
216241
217242 removals . push ( specifierPath ) ;
218243
219- // ensure that the Ember global is imported if needed
220- state . ensureEmberImport ( ) ;
221-
222244 if (
223245 path . scope . bindings [ local . name ] . referencePaths . find (
224246 ( rp ) => rp . parent . type === 'ExportSpecifier'
@@ -268,7 +290,7 @@ module.exports = function (babel) {
268290 if ( ! isTypescriptNode ( referencePath . parentPath ) ) {
269291 const memberExpression = getMemberExpressionFor (
270292 global ,
271- state . emberIdentifier
293+ state . ensureImport ( 'default' , 'ember' )
272294 ) ;
273295
274296 try {
0 commit comments