@@ -12,6 +12,11 @@ class DomGenerator extends Generator {
12
12
super ( parsed , source , names , visitors ) ;
13
13
this . renderers = [ ] ;
14
14
this . uses = { } ;
15
+
16
+ // allow compiler to deconflict user's `import { get } from 'whatever'` and
17
+ // Svelte's builtin `import { get, ... } from 'svelte/shared.js'`;
18
+ this . importedNames = { } ;
19
+ this . aliases = { } ;
15
20
}
16
21
17
22
addElement ( name , renderStatement , needsIdentifier = false ) {
@@ -23,13 +28,11 @@ class DomGenerator extends Generator {
23
28
24
29
this . createMountStatement ( name ) ;
25
30
} else {
26
- this . uses . appendNode = true ;
27
- this . current . builders . init . addLine ( `appendNode( ${ renderStatement } , ${ this . current . target } );` ) ;
31
+ this . current . builders . init . addLine ( `${ this . helper ( 'appendNode' ) } ( ${ renderStatement } , ${ this . current . target } );` ) ;
28
32
}
29
33
30
34
if ( isToplevel ) {
31
- this . uses . detachNode = true ;
32
- this . current . builders . detach . addLine ( `detachNode( ${ name } );` ) ;
35
+ this . current . builders . detach . addLine ( `${ this . helper ( 'detachNode' ) } ( ${ name } );` ) ;
33
36
}
34
37
}
35
38
@@ -55,8 +58,7 @@ class DomGenerator extends Generator {
55
58
if ( fragment . key ) properties . addBlock ( `key: key,` ) ;
56
59
57
60
if ( fragment . builders . mount . isEmpty ( ) ) {
58
- this . uses . noop = true ;
59
- properties . addBlock ( `mount: noop,` ) ;
61
+ properties . addBlock ( `mount: ${ this . helper ( 'noop' ) } ,` ) ;
60
62
} else {
61
63
properties . addBlock ( deindent `
62
64
mount: function ( target, anchor ) {
@@ -66,8 +68,7 @@ class DomGenerator extends Generator {
66
68
}
67
69
68
70
if ( fragment . builders . update . isEmpty ( ) ) {
69
- this . uses . noop = true ;
70
- properties . addBlock ( `update: noop,` ) ;
71
+ properties . addBlock ( `update: ${ this . helper ( 'noop' ) } ,` ) ;
71
72
} else {
72
73
properties . addBlock ( deindent `
73
74
update: function ( changed, ${ fragment . params } ) {
@@ -79,8 +80,7 @@ class DomGenerator extends Generator {
79
80
}
80
81
81
82
if ( fragment . builders . teardown . isEmpty ( ) ) {
82
- this . uses . noop = true ;
83
- properties . addBlock ( `teardown: noop,` ) ;
83
+ properties . addBlock ( `teardown: ${ this . helper ( 'noop' ) } ,` ) ;
84
84
} else {
85
85
properties . addBlock ( deindent `
86
86
teardown: function ( detach ) {
@@ -101,18 +101,15 @@ class DomGenerator extends Generator {
101
101
}
102
102
103
103
createAnchor ( name ) {
104
- this . uses . createComment = true ;
105
- const renderStatement = `createComment()` ;
104
+ const renderStatement = `${ this . helper ( 'createComment' ) } ()` ;
106
105
this . addElement ( name , renderStatement , true ) ;
107
106
}
108
107
109
108
createMountStatement ( name ) {
110
109
if ( this . current . target === 'target' ) {
111
- this . uses . insertNode = true ;
112
- this . current . builders . mount . addLine ( `insertNode( ${ name } , target, anchor );` ) ;
110
+ this . current . builders . mount . addLine ( `${ this . helper ( 'insertNode' ) } ( ${ name } , target, anchor );` ) ;
113
111
} else {
114
- this . uses . appendNode = true ;
115
- this . current . builders . init . addLine ( `appendNode( ${ name } , ${ this . current . target } );` ) ;
112
+ this . current . builders . init . addLine ( `${ this . helper ( 'appendNode' ) } ( ${ name } , ${ this . current . target } );` ) ;
116
113
}
117
114
}
118
115
@@ -133,6 +130,22 @@ class DomGenerator extends Generator {
133
130
// unset the children, to avoid them being visited again
134
131
node . children = [ ] ;
135
132
}
133
+
134
+ helper ( name ) {
135
+ this . uses [ name ] = true ;
136
+
137
+ if ( ! ( name in this . aliases ) ) {
138
+ let alias = name ;
139
+ let i = 1 ;
140
+ while ( alias in this . importedNames ) {
141
+ alias = `${ name } $${ i ++ } ` ;
142
+ }
143
+
144
+ this . aliases [ name ] = alias ;
145
+ }
146
+
147
+ return this . aliases [ name ] ;
148
+ }
136
149
}
137
150
138
151
export default function dom ( parsed , source , options , names ) {
@@ -143,6 +156,12 @@ export default function dom ( parsed, source, options, names ) {
143
156
144
157
const { computations, templateProperties } = generator . parseJs ( ) ;
145
158
159
+ generator . imports . forEach ( node => {
160
+ node . specifiers . forEach ( specifier => {
161
+ generator . importedNames [ specifier . local . name ] = true ;
162
+ } ) ;
163
+ } ) ;
164
+
146
165
let namespace = null ;
147
166
if ( templateProperties . namespace ) {
148
167
const ns = templateProperties . namespace . value ;
@@ -214,15 +233,12 @@ export default function dom ( parsed, source, options, names ) {
214
233
}
215
234
216
235
if ( parsed . css && options . css !== false ) {
217
- generator . uses . appendNode = true ;
218
- generator . uses . createElement = true ;
219
-
220
236
builders . main . addBlock ( deindent `
221
237
let addedCss = false;
222
238
function addCss () {
223
- var style = createElement( 'style' );
239
+ var style = ${ generator . helper ( ' createElement' ) } ( 'style' );
224
240
style.textContent = ${ JSON . stringify ( processCss ( parsed , generator . code ) ) } ;
225
- appendNode( style, document.head );
241
+ ${ generator . helper ( ' appendNode' ) } ( style, document.head );
226
242
227
243
addedCss = true;
228
244
}
@@ -305,12 +321,12 @@ export default function dom ( parsed, source, options, names ) {
305
321
306
322
builders . main . addBlock ( sharedPath ?
307
323
deindent `
308
- ${ name } .prototype.get = get;
309
- ${ name } .prototype.fire = fire;
310
- ${ name } .prototype.observe = observe;
311
- ${ name } .prototype.on = on ;
312
- ${ name } .prototype.set = set;
313
- ${ name } .prototype._flush = _flush;
324
+ ${ name } .prototype.get = ${ generator . helper ( ' get' ) } ;
325
+ ${ name } .prototype.fire = ${ generator . helper ( ' fire' ) } ;
326
+ ${ name } .prototype.observe = ${ generator . helper ( ' observe' ) } ;
327
+ ${ name } .prototype.on = ${ generator . helper ( 'on' ) } ;
328
+ ${ name } .prototype.set = ${ generator . helper ( ' set' ) } ;
329
+ ${ name } .prototype._flush = ${ generator . helper ( ' _flush' ) } ;
314
330
` :
315
331
deindent `
316
332
${ name } .prototype.get = ${ shared . get } ;
@@ -347,7 +363,9 @@ export default function dom ( parsed, source, options, names ) {
347
363
throw new Error ( `Components with shared helpers must be compiled to ES2015 modules (format: 'es')` ) ;
348
364
}
349
365
350
- const names = [ 'get' , 'fire' , 'observe' , 'on' , 'set' , '_flush' , 'dispatchObservers' ] . concat ( Object . keys ( generator . uses ) ) ;
366
+ const names = [ 'get' , 'fire' , 'observe' , 'on' , 'set' , '_flush' , 'dispatchObservers' ] . concat ( Object . keys ( generator . uses ) )
367
+ . map ( name => name in generator . aliases ? `${ name } as ${ generator . aliases [ name ] } ` : name ) ;
368
+
351
369
builders . main . addLineAtStart (
352
370
`import { ${ names . join ( ', ' ) } } from ${ JSON . stringify ( sharedPath ) } `
353
371
) ;
0 commit comments