@@ -36,7 +36,13 @@ const elmWebComponents = {
36
36
register (
37
37
name ,
38
38
ElmComponent ,
39
- { setupPorts = ( ) => { } , staticFlags = { } , onDetached = ( ) => { } , mapFlags = flags => flags } = { }
39
+ {
40
+ setupPorts = ( ) => { } ,
41
+ staticFlags = { } ,
42
+ onDetached = ( ) => { } ,
43
+ mapFlags = flags => flags ,
44
+ onSetupError = ( ) => { }
45
+ } = { }
40
46
) {
41
47
if ( ! this . __elmVersion ) {
42
48
if ( ! hasWarnedAboutMissingElmVersion ) {
@@ -56,29 +62,36 @@ const elmWebComponents = {
56
62
57
63
class ElmElement extends HTMLElement {
58
64
connectedCallback ( ) {
59
- let props = Object . assign ( { } , getProps ( this ) , staticFlags )
60
- if ( Object . keys ( props ) . length === 0 ) props = undefined
61
-
62
- const flags = mapFlags ( props )
63
-
64
- if ( elmVersion === '0.19' ) {
65
- /* a change in Elm 0.19 means that ElmComponent.init now replaces the node you give it
66
- * whereas in 0.18 it rendered into it. To avoid Elm therefore destroying our custom element
67
- * we create a div that we let Elm render into, and manually clear any pre-rendered contents.
68
- */
69
- const elmDiv = document . createElement ( 'div' )
70
-
71
- this . innerHTML = ''
72
- this . appendChild ( elmDiv )
73
-
74
- const elmElement = ElmComponent . init ( {
75
- flags,
76
- node : elmDiv ,
77
- } )
78
- setupPorts ( elmElement . ports )
79
- } else if ( elmVersion === '0.18' ) {
80
- const elmElement = ElmComponent . embed ( this , flags )
81
- setupPorts ( elmElement . ports )
65
+ const context = { } ;
66
+ try {
67
+ let props = Object . assign ( { } , getProps ( this ) , staticFlags )
68
+ if ( Object . keys ( props ) . length === 0 ) props = undefined
69
+
70
+ const flags = mapFlags ( props )
71
+ context . flags = flags ;
72
+
73
+ if ( elmVersion === '0.19' ) {
74
+ /* a change in Elm 0.19 means that ElmComponent.init now replaces the node you give it
75
+ * whereas in 0.18 it rendered into it. To avoid Elm therefore destroying our custom element
76
+ * we create a div that we let Elm render into, and manually clear any pre-rendered contents.
77
+ */
78
+ const elmDiv = document . createElement ( 'div' )
79
+
80
+ this . innerHTML = ''
81
+ this . appendChild ( elmDiv )
82
+
83
+ const elmElement = ElmComponent . init ( {
84
+ flags,
85
+ node : elmDiv ,
86
+ } )
87
+ setupPorts ( elmElement . ports )
88
+ } else if ( elmVersion === '0.18' ) {
89
+ const elmElement = ElmComponent . embed ( this , flags )
90
+ setupPorts ( elmElement . ports )
91
+ }
92
+ } catch ( error ) {
93
+ console . error ( error )
94
+ onSetupError ( error , context )
82
95
}
83
96
}
84
97
0 commit comments