Skip to content

Commit c389ae6

Browse files
committed
element-registry registration passes a lambda with a require call.
Allowing bundlers to replace the require with their own version.
1 parent 0dafa27 commit c389ae6

File tree

2 files changed

+45
-52
lines changed

2 files changed

+45
-52
lines changed
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import {View} from 'ui/core/view';
22

3-
export interface TypeId {
4-
moduleName: string;
5-
className: string;
6-
}
3+
export type ViewResolver = () => ViewClass;
74

85
export interface ViewClass {
96
new(): View
107
}
118

12-
export function registerElement(elementName: string, typeId: TypeId): void;
13-
export function isKnownView(elementName: string): boolean;
9+
export function registerElement(elementName: string, resolver: ViewResolver): void;
1410
export function getViewClass(elementName: string): ViewClass;
11+
export function isKnownView(elementName: string): boolean;
Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,32 @@
11
import {View} from 'ui/core/view';
22

3-
export interface TypeId {
4-
moduleName: string;
5-
className: string;
6-
}
7-
83
export interface ViewClass {
94
new(): View
105
}
116

12-
var elementMap: Map<string, TypeId> = new Map<string, TypeId>();
7+
export type ViewResolver = () => ViewClass;
8+
9+
var elementMap: Map<string, ViewResolver> = new Map<string, ViewResolver>();
1310

14-
export function registerElement(elementName: string, typeId: TypeId): void {
11+
export function registerElement(elementName: string, resolver: ViewResolver): void {
1512
if (elementMap.has(elementName)) {
1613
throw new Error(`Element for ${elementName} already registered.`);
1714
} else {
18-
elementMap.set(elementName, typeId);
19-
elementMap.set(elementName.toLowerCase(), typeId);
15+
elementMap.set(elementName, resolver);
16+
elementMap.set(elementName.toLowerCase(), resolver);
2017
}
2118
}
2219

2320
export function getViewClass(elementName: string): ViewClass {
24-
let typeId = elementMap.get(elementName) ||
21+
const resolver = elementMap.get(elementName) ||
2522
elementMap.get(elementName.toLowerCase());
26-
if (!typeId) {
23+
if (!resolver) {
2724
throw new TypeError(`No known component for element ${elementName}.`);
2825
}
2926
try {
30-
let module = require(typeId.moduleName);
31-
return module[typeId.className];
27+
return resolver();
3228
} catch (e) {
33-
throw new TypeError(`Could not load type: ${typeId.moduleName}.${typeId.className}.
29+
throw new TypeError(`Could not load view for: ${elementName}.
3430
3531
${e}`);
3632
}
@@ -42,36 +38,36 @@ export function isKnownView(elementName: string): boolean {
4238
}
4339

4440
//Register default NativeScript components
45-
registerElement("AbsoluteLayout", {className: "AbsoluteLayout", moduleName: "ui/layouts/absolute-layout"});
46-
registerElement("ActionBar", {className: "ActionBar", moduleName: "ui/action-bar"});
47-
registerElement("ActionItem", {className: "ActionItem", moduleName: "ui/action-bar"});
48-
registerElement("ActivityIndicator", {className: "ActivityIndicator", moduleName: "ui/activity-indicator"});
49-
registerElement("Border", {className: "Border", moduleName: "ui/border"});
50-
registerElement("Button", {className: "Button", moduleName: "ui/button"});
51-
registerElement("ContentView", {className: "ContentView", moduleName: "ui/content-view"});
52-
registerElement("DatePicker", {className: "DatePicker", moduleName: "ui/date-picker"});
53-
registerElement("DockLayout", {className: "DockLayout", moduleName: "ui/layouts/dock-layout"});
54-
registerElement("GridLayout", {className: "GridLayout", moduleName: "ui/layouts/grid-layout"});
55-
registerElement("HtmlView", {className: "HtmlView", moduleName: "ui/html-view"});
56-
registerElement("Image", {className: "Image", moduleName: "ui/image"});
41+
registerElement("AbsoluteLayout", () => require("ui/layouts/absolute-layout").AbsoluteLayout);
42+
registerElement("ActionBar", () => require("ui/action-bar").ActionBar);
43+
registerElement("ActionItem", () => require("ui/action-bar").ActionItem);
44+
registerElement("ActivityIndicator", () => require("ui/activity-indicator").ActivityIndicator);
45+
registerElement("Border", () => require("ui/border").Border);
46+
registerElement("Button", () => require("ui/button").Button);
47+
registerElement("ContentView", () => require("ui/content-view").ContentView);
48+
registerElement("DatePicker", () => require("ui/date-picker").DatePicker);
49+
registerElement("DockLayout", () => require("ui/layouts/dock-layout").DockLayout);
50+
registerElement("GridLayout", () => require("ui/layouts/grid-layout").GridLayout);
51+
registerElement("HtmlView", () => require("ui/html-view").HtmlView);
52+
registerElement("Image", () => require("ui/image").Image);
5753
// Parse5 changes <Image> tags to <img>. WTF!
58-
registerElement("img", {className: "Image", moduleName: "ui/image"});
59-
registerElement("Label", {className: "Label", moduleName: "ui/label"});
60-
registerElement("ListPicker", {className: "ListPicker", moduleName: "ui/list-picker"});
61-
registerElement("ListView", {className: "ListView", moduleName: "ui/list-view"});
62-
registerElement("Page", {className: "Page", moduleName: "ui/page"});
63-
registerElement("Placeholder", {className: "Placeholder", moduleName: "ui/placeholder"});
64-
registerElement("Progress", {className: "Progress", moduleName: "ui/progress"});
65-
registerElement("Repeater", {className: "Repeater", moduleName: "ui/repeater"});
66-
registerElement("ScrollView", {className: "ScrollView", moduleName: "ui/scroll-view"});
67-
registerElement("SearchBar", {className: "SearchBar", moduleName: "ui/search-bar"});
68-
registerElement("SegmentedBar", {className: "SegmentedBar", moduleName: "ui/segmented-bar"});
69-
registerElement("Slider", {className: "Slider", moduleName: "ui/slider"});
70-
registerElement("StackLayout", {className: "StackLayout", moduleName: "ui/layouts/stack-layout"});
71-
registerElement("Switch", {className: "Switch", moduleName: "ui/switch"});
72-
registerElement("TabView", {className: "TabView", moduleName: "ui/tab-view"});
73-
registerElement("TextField", {className: "TextField", moduleName: "ui/text-field"});
74-
registerElement("TextView", {className: "TextView", moduleName: "ui/text-view"});
75-
registerElement("TimePicker", {className: "TimePicker", moduleName: "ui/time-picker"});
76-
registerElement("WebView", {className: "WebView", moduleName: "ui/web-view"});
77-
registerElement("WrapLayout", {className: "WrapLayout", moduleName: "ui/layouts/wrap-layout"});
54+
registerElement("img", () => require("ui/image").Image);
55+
registerElement("Label", () => require("ui/label").Label);
56+
registerElement("ListPicker", () => require("ui/list-picker").ListPicker);
57+
registerElement("ListView", () => require("ui/list-view").ListView);
58+
registerElement("Page", () => require("ui/page").Page);
59+
registerElement("Placeholder", () => require("ui/placeholder").Placeholder);
60+
registerElement("Progress", () => require("ui/progress").Progress);
61+
registerElement("Repeater", () => require("ui/repeater").Repeater);
62+
registerElement("ScrollView", () => require("ui/scroll-view").ScrollView);
63+
registerElement("SearchBar", () => require("ui/search-bar").SearchBar);
64+
registerElement("SegmentedBar", () => require("ui/segmented-bar").SegmentedBar);
65+
registerElement("Slider", () => require("ui/slider").Slider);
66+
registerElement("StackLayout", () => require("ui/layouts/stack-layout").StackLayout);
67+
registerElement("Switch", () => require("ui/switch").Switch);
68+
registerElement("TabView", () => require("ui/tab-view").TabView);
69+
registerElement("TextField", () => require("ui/text-field").TextField);
70+
registerElement("TextView", () => require("ui/text-view").TextView);
71+
registerElement("TimePicker", () => require("ui/time-picker").TimePicker);
72+
registerElement("WebView", () => require("ui/web-view").WebView);
73+
registerElement("WrapLayout", () => require("ui/layouts/wrap-layout").WrapLayout);

0 commit comments

Comments
 (0)