@@ -131,82 +131,6 @@ function getElementAsTagText(element) {
131131 : element . outerHTML ;
132132}
133133
134- let componentMapByElement = new WeakMap ( ) ;
135- let componentMapByComponent = new Map ( ) ;
136- const registerComponent = ( component ) => {
137- componentMapByElement . set ( component . element , component ) ;
138- componentMapByComponent . set ( component , component . name ) ;
139- } ;
140- const unregisterComponent = ( component ) => {
141- componentMapByElement . delete ( component . element ) ;
142- componentMapByComponent . delete ( component ) ;
143- } ;
144- const getComponent = ( element ) => new Promise ( ( resolve , reject ) => {
145- let count = 0 ;
146- const maxCount = 10 ;
147- const interval = setInterval ( ( ) => {
148- const component = componentMapByElement . get ( element ) ;
149- if ( component ) {
150- clearInterval ( interval ) ;
151- resolve ( component ) ;
152- }
153- count ++ ;
154- if ( count > maxCount ) {
155- clearInterval ( interval ) ;
156- reject ( new Error ( `Component not found for element ${ getElementAsTagText ( element ) } ` ) ) ;
157- }
158- } , 5 ) ;
159- } ) ;
160- const findComponents = ( currentComponent , onlyParents , onlyMatchName ) => {
161- const components = [ ] ;
162- componentMapByComponent . forEach ( ( componentName , component ) => {
163- if ( onlyParents && ( currentComponent === component || ! component . element . contains ( currentComponent . element ) ) ) {
164- return ;
165- }
166- if ( onlyMatchName && componentName !== onlyMatchName ) {
167- return ;
168- }
169- components . push ( component ) ;
170- } ) ;
171- return components ;
172- } ;
173- const findChildren = ( currentComponent ) => {
174- const children = [ ] ;
175- componentMapByComponent . forEach ( ( componentName , component ) => {
176- if ( currentComponent === component ) {
177- return ;
178- }
179- if ( ! currentComponent . element . contains ( component . element ) ) {
180- return ;
181- }
182- let foundChildComponent = false ;
183- componentMapByComponent . forEach ( ( childComponentName , childComponent ) => {
184- if ( foundChildComponent ) {
185- return ;
186- }
187- if ( childComponent === component ) {
188- return ;
189- }
190- if ( childComponent . element . contains ( component . element ) ) {
191- foundChildComponent = true ;
192- }
193- } ) ;
194- children . push ( component ) ;
195- } ) ;
196- return children ;
197- } ;
198- const findParent = ( currentComponent ) => {
199- let parentElement = currentComponent . element . parentElement ;
200- while ( parentElement ) {
201- const component = componentMapByElement . get ( parentElement ) ;
202- if ( component ) {
203- return component ;
204- }
205- parentElement = parentElement . parentElement ;
206- }
207- return null ;
208- } ;
209-
210134function getValueFromElement ( element , valueStore ) {
211135 if ( element instanceof HTMLInputElement ) {
212136 if ( element . type === 'checkbox' ) {
@@ -328,16 +252,8 @@ function elementBelongsToThisComponent(element, component) {
328252 if ( ! component . element . contains ( element ) ) {
329253 return false ;
330254 }
331- let foundChildComponent = false ;
332- findChildren ( component ) . forEach ( ( childComponent ) => {
333- if ( foundChildComponent ) {
334- return ;
335- }
336- if ( childComponent . element === element || childComponent . element . contains ( element ) ) {
337- foundChildComponent = true ;
338- }
339- } ) ;
340- return ! foundChildComponent ;
255+ const closestLiveComponent = element . closest ( '[data-controller~="live"]' ) ;
256+ return closestLiveComponent === component . element ;
341257}
342258function cloneHTMLElement ( element ) {
343259 const newElement = element . cloneNode ( true ) ;
@@ -1883,6 +1799,82 @@ class ExternalMutationTracker {
18831799 }
18841800}
18851801
1802+ let componentMapByElement = new WeakMap ( ) ;
1803+ let componentMapByComponent = new Map ( ) ;
1804+ const registerComponent = ( component ) => {
1805+ componentMapByElement . set ( component . element , component ) ;
1806+ componentMapByComponent . set ( component , component . name ) ;
1807+ } ;
1808+ const unregisterComponent = ( component ) => {
1809+ componentMapByElement . delete ( component . element ) ;
1810+ componentMapByComponent . delete ( component ) ;
1811+ } ;
1812+ const getComponent = ( element ) => new Promise ( ( resolve , reject ) => {
1813+ let count = 0 ;
1814+ const maxCount = 10 ;
1815+ const interval = setInterval ( ( ) => {
1816+ const component = componentMapByElement . get ( element ) ;
1817+ if ( component ) {
1818+ clearInterval ( interval ) ;
1819+ resolve ( component ) ;
1820+ }
1821+ count ++ ;
1822+ if ( count > maxCount ) {
1823+ clearInterval ( interval ) ;
1824+ reject ( new Error ( `Component not found for element ${ getElementAsTagText ( element ) } ` ) ) ;
1825+ }
1826+ } , 5 ) ;
1827+ } ) ;
1828+ const findComponents = ( currentComponent , onlyParents , onlyMatchName ) => {
1829+ const components = [ ] ;
1830+ componentMapByComponent . forEach ( ( componentName , component ) => {
1831+ if ( onlyParents && ( currentComponent === component || ! component . element . contains ( currentComponent . element ) ) ) {
1832+ return ;
1833+ }
1834+ if ( onlyMatchName && componentName !== onlyMatchName ) {
1835+ return ;
1836+ }
1837+ components . push ( component ) ;
1838+ } ) ;
1839+ return components ;
1840+ } ;
1841+ const findChildren = ( currentComponent ) => {
1842+ const children = [ ] ;
1843+ componentMapByComponent . forEach ( ( componentName , component ) => {
1844+ if ( currentComponent === component ) {
1845+ return ;
1846+ }
1847+ if ( ! currentComponent . element . contains ( component . element ) ) {
1848+ return ;
1849+ }
1850+ let foundChildComponent = false ;
1851+ componentMapByComponent . forEach ( ( childComponentName , childComponent ) => {
1852+ if ( foundChildComponent ) {
1853+ return ;
1854+ }
1855+ if ( childComponent === component ) {
1856+ return ;
1857+ }
1858+ if ( childComponent . element . contains ( component . element ) ) {
1859+ foundChildComponent = true ;
1860+ }
1861+ } ) ;
1862+ children . push ( component ) ;
1863+ } ) ;
1864+ return children ;
1865+ } ;
1866+ const findParent = ( currentComponent ) => {
1867+ let parentElement = currentComponent . element . parentElement ;
1868+ while ( parentElement ) {
1869+ const component = componentMapByElement . get ( parentElement ) ;
1870+ if ( component ) {
1871+ return component ;
1872+ }
1873+ parentElement = parentElement . parentElement ;
1874+ }
1875+ return null ;
1876+ } ;
1877+
18861878class Component {
18871879 constructor ( element , name , props , listeners , id , backend , elementDriver ) {
18881880 this . fingerprint = '' ;
0 commit comments