@@ -8,30 +8,37 @@ import React from "react";
8
8
* dynamic import cannot rely on purely a dynamic path i.e a variable.
9
9
*/
10
10
export async function importWidget (
11
- templateLoader ,
11
+ templateLoaders ,
12
12
{ ui_widget : UIWidget , fieldPath, props }
13
13
) {
14
- let component = null ;
15
- try {
16
- // First try import widget from user's defined templateLoader
17
- const module = await templateLoader ( UIWidget ) ;
18
- component = module . default ?? module [ UIWidget ] ;
19
- } catch ( error ) {
14
+ let component = undefined ;
15
+
16
+ // Try import widget from user's defined templateLoaders
17
+ for ( const loader of templateLoaders ) {
20
18
try {
21
- // If not then look into widgets folder for the component
22
- const module = await import ( "./index" ) ;
19
+ const module = await loader ( UIWidget ) ;
23
20
component = module . default ?? module [ UIWidget ] ;
21
+ // Component was found, stop looking.
22
+ if ( component ) {
23
+ break ;
24
+ }
24
25
} catch ( error ) {
25
- console . error ( `Failed to import default component ${ UIWidget } .js` ) ;
26
+ // If the component failed to load from a loader, try other loaders first.
27
+ continue ;
26
28
}
27
29
}
28
- if ( component ) {
29
- return React . createElement ( component , {
30
- ...props ,
31
- key : fieldPath ,
32
- fieldPath : fieldPath ,
33
- } ) ;
30
+
31
+ // Loading failed, log it and throw an error.
32
+ if ( component === undefined ) {
33
+ console . error ( `Failed to import default component ${ UIWidget } .js` ) ;
34
+ throw Error ( "Component not found in any loader" ) ;
34
35
}
36
+
37
+ return React . createElement ( component , {
38
+ ...props ,
39
+ key : fieldPath ,
40
+ fieldPath : fieldPath ,
41
+ } ) ;
35
42
}
36
43
37
44
/**
@@ -62,7 +69,7 @@ export async function importWidget(
62
69
*
63
70
*/
64
71
export async function loadWidgetsFromConfig ( {
65
- templateLoader ,
72
+ templateLoaders ,
66
73
fieldPathPrefix,
67
74
fields,
68
75
} ) {
@@ -81,7 +88,7 @@ export async function loadWidgetsFromConfig({
81
88
return Promise . all ( tplPromises ) ;
82
89
} ;
83
90
const _fields = await importWidgetsFromFolder (
84
- templateLoader ,
91
+ templateLoaders ,
85
92
fieldPathPrefix ,
86
93
fields
87
94
) ;
0 commit comments