@@ -4,6 +4,36 @@ import { create_fragment_from_html } from './reconciler.js';
4
4
import { current_effect } from '../runtime.js' ;
5
5
import { TEMPLATE_FRAGMENT , TEMPLATE_USE_IMPORT_NODE } from '../../../constants.js' ;
6
6
import { effect } from '../reactivity/effects.js' ;
7
+ import { is_array } from '../utils.js' ;
8
+
9
+ /**
10
+ * @param {import("#client").Effect } effect
11
+ * @param {import("#client").TemplateNode | import("#client").TemplateNode[] } dom
12
+ */
13
+ export function push_template_node ( effect , dom ) {
14
+ var current_dom = effect . dom ;
15
+ if ( current_dom === null ) {
16
+ effect . dom = dom ;
17
+ } else {
18
+ if ( ! is_array ( current_dom ) ) {
19
+ current_dom = effect . dom = [ current_dom ] ;
20
+ }
21
+ var anchor ;
22
+ // If we're working with an anchor, then remove it and put it at the end.
23
+ if ( current_dom [ 0 ] . nodeType === 8 ) {
24
+ anchor = current_dom . pop ( ) ;
25
+ }
26
+ if ( is_array ( dom ) ) {
27
+ current_dom . push ( ...dom ) ;
28
+ } else {
29
+ current_dom . push ( dom ) ;
30
+ }
31
+ if ( anchor !== undefined ) {
32
+ current_dom . push ( anchor ) ;
33
+ }
34
+ }
35
+ return dom ;
36
+ }
7
37
8
38
/**
9
39
* @param {string } content
@@ -19,16 +49,31 @@ export function template(content, flags) {
19
49
var node ;
20
50
21
51
return ( ) => {
52
+ var effect = /** @type {import('#client').Effect } */ ( current_effect ) ;
22
53
if ( hydrating ) {
23
- return is_fragment ? hydrate_nodes : /** @type {Node } */ ( hydrate_nodes [ 0 ] ) ;
54
+ var hydration_content = push_template_node (
55
+ effect ,
56
+ is_fragment ? hydrate_nodes : hydrate_nodes [ 0 ]
57
+ ) ;
58
+ return /** @type {Node } */ ( hydration_content ) ;
24
59
}
25
60
26
61
if ( ! node ) {
27
62
node = create_fragment_from_html ( content ) ;
28
63
if ( ! is_fragment ) node = /** @type {Node } */ ( node . firstChild ) ;
29
64
}
65
+ var clone = use_import_node ? document . importNode ( node , true ) : clone_node ( node , true ) ;
66
+
67
+ if ( is_fragment ) {
68
+ push_template_node (
69
+ effect ,
70
+ /** @type {import('#client').TemplateNode[] } */ ( [ ...clone . childNodes ] )
71
+ ) ;
72
+ } else {
73
+ push_template_node ( effect , /** @type {import('#client').TemplateNode } */ ( clone ) ) ;
74
+ }
30
75
31
- return use_import_node ? document . importNode ( node , true ) : clone_node ( node , true ) ;
76
+ return clone ;
32
77
} ;
33
78
}
34
79
@@ -70,8 +115,13 @@ export function svg_template(content, flags) {
70
115
var node ;
71
116
72
117
return ( ) => {
118
+ var effect = /** @type {import('#client').Effect } */ ( current_effect ) ;
73
119
if ( hydrating ) {
74
- return is_fragment ? hydrate_nodes : /** @type {Node } */ ( hydrate_nodes [ 0 ] ) ;
120
+ var hydration_content = push_template_node (
121
+ effect ,
122
+ is_fragment ? hydrate_nodes : hydrate_nodes [ 0 ]
123
+ ) ;
124
+ return /** @type {Node } */ ( hydration_content ) ;
75
125
}
76
126
77
127
if ( ! node ) {
@@ -87,7 +137,18 @@ export function svg_template(content, flags) {
87
137
}
88
138
}
89
139
90
- return clone_node ( node , true ) ;
140
+ var clone = clone_node ( node , true ) ;
141
+
142
+ if ( is_fragment ) {
143
+ push_template_node (
144
+ effect ,
145
+ /** @type {import('#client').TemplateNode[] } */ ( [ ...clone . childNodes ] )
146
+ ) ;
147
+ } else {
148
+ push_template_node ( effect , /** @type {import('#client').TemplateNode } */ ( clone ) ) ;
149
+ }
150
+
151
+ return clone ;
91
152
} ;
92
153
}
93
154
@@ -152,7 +213,8 @@ function run_scripts(node) {
152
213
*/
153
214
/*#__NO_SIDE_EFFECTS__*/
154
215
export function text ( anchor ) {
155
- if ( ! hydrating ) return empty ( ) ;
216
+ var effect = /** @type {import('#client').Effect } */ ( current_effect ) ;
217
+ if ( ! hydrating ) return push_template_node ( effect , empty ( ) ) ;
156
218
157
219
var node = hydrate_nodes [ 0 ] ;
158
220
@@ -162,7 +224,7 @@ export function text(anchor) {
162
224
anchor . before ( ( node = empty ( ) ) ) ;
163
225
}
164
226
165
- return node ;
227
+ return push_template_node ( effect , node ) ;
166
228
}
167
229
168
230
export const comment = template ( '<!>' , TEMPLATE_FRAGMENT ) ;
@@ -174,19 +236,7 @@ export const comment = template('<!>', TEMPLATE_FRAGMENT);
174
236
* @param {import('#client').Dom } dom
175
237
*/
176
238
export function append ( anchor , dom ) {
177
- var current = dom ;
178
-
179
239
if ( ! hydrating ) {
180
- var node = /** @type {Node } */ ( dom ) ;
181
-
182
- if ( node . nodeType === 11 ) {
183
- // if hydrating, `dom` is already an array of nodes, but if not then
184
- // we need to create an array to store it on the current effect
185
- current = /** @type {import('#client').Dom } */ ( [ ...node . childNodes ] ) ;
186
- }
187
-
188
- anchor . before ( node ) ;
240
+ anchor . before ( /** @type {Node } */ ( dom ) ) ;
189
241
}
190
-
191
- /** @type {import('#client').Effect } */ ( current_effect ) . dom = current ;
192
242
}
0 commit comments