@ibyar/core 0.3.8 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/annotation/decorators.d.ts +2 -3
- package/annotation/decorators.js.map +1 -1
- package/binding/binding.expressions.d.ts +32 -0
- package/binding/binding.expressions.js +99 -0
- package/binding/binding.expressions.js.map +1 -0
- package/component/component.d.ts +3 -4
- package/component/component.js +5 -1
- package/component/component.js.map +1 -1
- package/component/custom-element.d.ts +15 -17
- package/component/custom-element.js.map +1 -1
- package/component/provider.d.ts +3 -0
- package/component/provider.js +16 -3
- package/component/provider.js.map +1 -1
- package/directive/directive.d.ts +6 -10
- package/directive/directive.js +3 -8
- package/directive/directive.js.map +1 -1
- package/directive/parser.d.ts +30 -0
- package/directive/parser.js +174 -0
- package/directive/parser.js.map +1 -0
- package/html/expression.d.ts +21 -2
- package/html/expression.js +81 -17
- package/html/expression.js.map +1 -1
- package/index.d.ts +3 -2
- package/index.js +3 -2
- package/index.js.map +1 -1
- package/linker/template-ref.d.ts +18 -0
- package/linker/template-ref.js +59 -0
- package/linker/template-ref.js.map +1 -0
- package/linker/view-container-ref.d.ts +39 -0
- package/linker/view-container-ref.js +82 -0
- package/linker/view-container-ref.js.map +1 -0
- package/linker/view-ref.d.ts +36 -0
- package/linker/view-ref.js +75 -0
- package/linker/view-ref.js.map +1 -0
- package/package.json +14 -6
- package/pipe/pipe.d.ts +17 -3
- package/pipe/pipe.js +33 -7
- package/pipe/pipe.js.map +1 -1
- package/providers/provider.d.ts +1 -1
- package/providers/provider.js +6 -3
- package/providers/provider.js.map +1 -1
- package/utils/elements-util.js +4 -1
- package/utils/elements-util.js.map +1 -1
- package/view/base-view.d.ts +1 -1
- package/view/base-view.js +41 -45
- package/view/base-view.js.map +1 -1
- package/view/mutation.d.ts +41 -6
- package/view/mutation.js +159 -24
- package/view/mutation.js.map +1 -1
- package/view/render.d.ts +22 -18
- package/view/render.js +164 -141
- package/view/render.js.map +1 -1
- package/view/view.d.ts +2 -2
- package/view/view.js +7 -12
- package/view/view.js.map +1 -1
- package/html/update.d.ts +0 -12
- package/html/update.js +0 -24
- package/html/update.js.map +0 -1
- package/model/change-detection.d.ts +0 -13
- package/model/change-detection.js +0 -76
- package/model/change-detection.js.map +0 -1
- package/utils/observable.d.ts +0 -8
- package/utils/observable.js +0 -34
- package/utils/observable.js.map +0 -1
package/view/render.js
CHANGED
|
@@ -1,34 +1,32 @@
|
|
|
1
|
-
import { CommentNode,
|
|
1
|
+
import { CommentNode, DomStructuralDirectiveNode, DomElementNode, DomFragmentNode, isLiveTextContent, isTagNameNative, isValidCustomElementName, TextContent } from '@ibyar/elements';
|
|
2
2
|
import { ElementMutation } from './mutation.js';
|
|
3
3
|
import { isHTMLComponent } from '../component/custom-element.js';
|
|
4
4
|
import { documentStack } from '../context/stack.js';
|
|
5
5
|
import { ClassRegistryProvider } from '../providers/provider.js';
|
|
6
6
|
import { isOnDestroy, isOnInit } from '../component/lifecycle.js';
|
|
7
7
|
import { hasAttr } from '../utils/elements-util.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
import { AttributeDirective } from '../directive/directive.js';
|
|
9
|
+
import { TemplateRefImpl } from '../linker/template-ref.js';
|
|
10
|
+
import { ViewContainerRefImpl } from '../linker/view-container-ref.js';
|
|
11
|
+
function getInputEventName(element) {
|
|
12
|
+
switch (true) {
|
|
13
|
+
case element instanceof HTMLInputElement:
|
|
14
14
|
return 'input';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|| element instanceof HTMLTextAreaElement) {
|
|
15
|
+
case element instanceof HTMLTextAreaElement:
|
|
16
|
+
case element instanceof HTMLSelectElement:
|
|
18
17
|
return 'change';
|
|
19
|
-
|
|
18
|
+
default:
|
|
19
|
+
return undefined;
|
|
20
20
|
}
|
|
21
|
-
return elementAttr;
|
|
22
21
|
}
|
|
23
22
|
export class ComponentRender {
|
|
24
23
|
constructor(view) {
|
|
25
24
|
this.view = view;
|
|
26
|
-
this.templateRefMap = new Map();
|
|
27
25
|
this.componentRef = this.view.getComponentRef();
|
|
28
26
|
this.contextStack = documentStack.copyStack();
|
|
29
|
-
this.contextStack.pushFunctionScope();
|
|
30
|
-
this.contextStack.pushScope(this.view._viewScope);
|
|
31
27
|
this.contextStack.pushScope(this.view._modelScope);
|
|
28
|
+
this.templateNameScope = this.contextStack.pushBlockReactiveScope();
|
|
29
|
+
this.nativeElementMutation = new ElementMutation();
|
|
32
30
|
}
|
|
33
31
|
initView() {
|
|
34
32
|
if (this.componentRef.template) {
|
|
@@ -52,13 +50,19 @@ export class ComponentRender {
|
|
|
52
50
|
rootRef = this.view;
|
|
53
51
|
}
|
|
54
52
|
this.initTemplateRefMap(this.template);
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
let rootFragment;
|
|
54
|
+
if (this.template instanceof DomFragmentNode) {
|
|
55
|
+
rootFragment = this.createDocumentFragment(this.template, this.contextStack, rootRef);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
rootFragment = document.createDocumentFragment();
|
|
59
|
+
this.appendChildToParent(rootFragment, this.template, this.contextStack, rootRef);
|
|
60
|
+
}
|
|
57
61
|
rootRef.append(rootFragment);
|
|
58
62
|
}
|
|
59
63
|
}
|
|
60
64
|
isTemplateRefName(template) {
|
|
61
|
-
if (template instanceof
|
|
65
|
+
if (template instanceof DomElementNode) {
|
|
62
66
|
if (template.tagName === 'template' && template.templateRefName) {
|
|
63
67
|
return true;
|
|
64
68
|
}
|
|
@@ -66,22 +70,17 @@ export class ComponentRender {
|
|
|
66
70
|
return false;
|
|
67
71
|
}
|
|
68
72
|
initTemplateRefMap(domNode) {
|
|
69
|
-
if (domNode instanceof
|
|
73
|
+
if (domNode instanceof DomElementNode || domNode instanceof DomFragmentNode) {
|
|
70
74
|
if (domNode.children) {
|
|
71
|
-
const toRemove = [];
|
|
72
75
|
for (let index = 0; index < domNode.children.length; index++) {
|
|
73
76
|
const child = domNode.children[index];
|
|
74
77
|
if (this.isTemplateRefName(child)) {
|
|
75
|
-
|
|
78
|
+
this.templateNameScope.set(child.templateRefName.name, undefined);
|
|
76
79
|
}
|
|
77
80
|
else {
|
|
78
81
|
this.initTemplateRefMap(child);
|
|
79
82
|
}
|
|
80
83
|
}
|
|
81
|
-
toRemove.forEach(info => {
|
|
82
|
-
this.templateRefMap.set(info.template.templateRefName.name, info.template);
|
|
83
|
-
domNode.children.splice(info.index, 1);
|
|
84
|
-
});
|
|
85
84
|
}
|
|
86
85
|
}
|
|
87
86
|
}
|
|
@@ -96,7 +95,7 @@ export class ComponentRender {
|
|
|
96
95
|
if ('window' === eventSource.toLowerCase()) {
|
|
97
96
|
source = window;
|
|
98
97
|
this.addNativeEventListener(source, eventName, (event) => {
|
|
99
|
-
this.view._model[listener.modelCallbackName](event);
|
|
98
|
+
this.view._model[listener.modelCallbackName].call(this.view._proxyModel, event);
|
|
100
99
|
});
|
|
101
100
|
return;
|
|
102
101
|
}
|
|
@@ -104,7 +103,7 @@ export class ComponentRender {
|
|
|
104
103
|
source = Reflect.get(this.view, eventSource);
|
|
105
104
|
if (!Reflect.has(source, '_model')) {
|
|
106
105
|
this.addNativeEventListener(source, eventName, (event) => {
|
|
107
|
-
this.view._model[listener.modelCallbackName](event);
|
|
106
|
+
this.view._model[listener.modelCallbackName].call(this.view._proxyModel, event);
|
|
108
107
|
});
|
|
109
108
|
return;
|
|
110
109
|
}
|
|
@@ -120,36 +119,45 @@ export class ComponentRender {
|
|
|
120
119
|
const output = ClassRegistryProvider.hasOutput(sourceModel, eventName);
|
|
121
120
|
if (output) {
|
|
122
121
|
sourceModel[output.modelProperty].subscribe((value) => {
|
|
123
|
-
this.view._model[listener.modelCallbackName](value);
|
|
122
|
+
this.view._model[listener.modelCallbackName].call(this.view._proxyModel, value);
|
|
124
123
|
});
|
|
125
124
|
}
|
|
126
125
|
else if (Reflect.has(source, 'on' + eventName)) {
|
|
127
126
|
this.addNativeEventListener(source, eventName, (event) => {
|
|
128
|
-
this.view._model[listener.modelCallbackName](event);
|
|
127
|
+
this.view._model[listener.modelCallbackName].call(this.view._proxyModel, event);
|
|
129
128
|
});
|
|
130
129
|
}
|
|
131
130
|
else {
|
|
132
|
-
addChangeListener(sourceModel, eventName, () => this.view._model[listener.modelCallbackName]());
|
|
133
131
|
}
|
|
134
132
|
}
|
|
135
133
|
addNativeEventListener(source, eventName, funcCallback) {
|
|
136
134
|
source.addEventListener(eventName, (event) => {
|
|
137
|
-
funcCallback.call(this.view.
|
|
135
|
+
funcCallback.call(this.view._proxyModel, event);
|
|
138
136
|
});
|
|
139
137
|
}
|
|
140
138
|
getElementByName(name) {
|
|
141
139
|
return Reflect.get(this.view, name);
|
|
142
140
|
}
|
|
143
|
-
|
|
144
|
-
const directiveRef = ClassRegistryProvider.getDirectiveRef(directive.
|
|
141
|
+
createStructuralDirective(directive, comment, directiveStack, parentNode) {
|
|
142
|
+
const directiveRef = ClassRegistryProvider.getDirectiveRef(directive.name);
|
|
145
143
|
if (directiveRef) {
|
|
146
|
-
const
|
|
144
|
+
const StructuralDirectiveClass = directiveRef.modelClass;
|
|
145
|
+
const stack = directiveStack.copyStack();
|
|
146
|
+
const templateRef = new TemplateRefImpl(this, directive.node, stack, directive.templateExpressions ?? []);
|
|
147
|
+
const viewContainerRef = new ViewContainerRefImpl(parentNode, comment);
|
|
148
|
+
const structural = new StructuralDirectiveClass(templateRef, viewContainerRef);
|
|
149
|
+
stack.pushBlockReactiveScopeFor({ 'this': structural });
|
|
150
|
+
const subscriptions = this.initDirectiveAttributes(structural, directive, stack);
|
|
151
|
+
const removeSubscription = this.nativeElementMutation.subscribeOnRemoveNode(parentNode, comment, () => {
|
|
152
|
+
removeSubscription.unsubscribe();
|
|
153
|
+
subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
154
|
+
if (isOnDestroy(structural)) {
|
|
155
|
+
structural.onDestroy();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
147
158
|
if (isOnInit(structural)) {
|
|
148
159
|
structural.onInit();
|
|
149
160
|
}
|
|
150
|
-
if (isOnDestroy(structural)) {
|
|
151
|
-
this.view._model.subscribeModel('destroy', () => structural.onDestroy());
|
|
152
|
-
}
|
|
153
161
|
}
|
|
154
162
|
else {
|
|
155
163
|
}
|
|
@@ -160,40 +168,52 @@ export class ComponentRender {
|
|
|
160
168
|
createText(node) {
|
|
161
169
|
return new Text(node.value);
|
|
162
170
|
}
|
|
163
|
-
createLiveText(textNode, contextStack) {
|
|
171
|
+
createLiveText(textNode, contextStack, parentNode) {
|
|
164
172
|
const liveText = new Text('');
|
|
165
173
|
contextStack = contextStack.copyStack();
|
|
166
174
|
contextStack.pushBlockScopeFor({ this: liveText });
|
|
167
|
-
|
|
175
|
+
const subscriptions = textNode.expression.subscribe(contextStack, textNode.pipelineNames);
|
|
176
|
+
textNode.expression.get(contextStack);
|
|
177
|
+
const removeSubscription = this.nativeElementMutation.subscribeOnRemoveNode(parentNode, liveText, () => {
|
|
178
|
+
removeSubscription.unsubscribe();
|
|
179
|
+
subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
180
|
+
});
|
|
168
181
|
return liveText;
|
|
169
182
|
}
|
|
170
|
-
createDocumentFragment(node, contextStack) {
|
|
183
|
+
createDocumentFragment(node, contextStack, parentNode) {
|
|
171
184
|
const fragment = document.createDocumentFragment();
|
|
172
|
-
node.children
|
|
185
|
+
node.children?.forEach(child => this.appendChildToParent(fragment, child, contextStack, parentNode));
|
|
173
186
|
return fragment;
|
|
174
187
|
}
|
|
175
|
-
appendChildToParent(
|
|
176
|
-
if (child instanceof
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
188
|
+
appendChildToParent(fragmentParent, child, contextStack, parentNode) {
|
|
189
|
+
if (child instanceof DomElementNode) {
|
|
190
|
+
if (this.isTemplateRefName(child)) {
|
|
191
|
+
const templateRefName = child.templateRefName;
|
|
192
|
+
const templateRef = new TemplateRefImpl(this, new DomFragmentNode(child.children), contextStack.copyStack(), []);
|
|
193
|
+
this.templateNameScope.set(templateRefName.name, templateRef);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
fragmentParent.append(this.createElement(child, contextStack, parentNode));
|
|
197
|
+
}
|
|
198
|
+
else if (child instanceof DomStructuralDirectiveNode) {
|
|
199
|
+
const commentText = child.name + (typeof child.value == 'string' ? (' = ' + child.value) : '');
|
|
200
|
+
const comment = document.createComment(`start ${commentText}`);
|
|
201
|
+
fragmentParent.append(comment);
|
|
202
|
+
const lastComment = document.createComment(`end ${commentText}`);
|
|
183
203
|
comment.after(lastComment);
|
|
184
|
-
this.
|
|
204
|
+
this.createStructuralDirective(child, comment, contextStack, parentNode);
|
|
185
205
|
}
|
|
186
|
-
else if (child
|
|
187
|
-
|
|
206
|
+
else if (isLiveTextContent(child)) {
|
|
207
|
+
fragmentParent.append(this.createLiveText(child, contextStack, parentNode));
|
|
188
208
|
}
|
|
189
209
|
else if (child instanceof TextContent) {
|
|
190
|
-
|
|
210
|
+
fragmentParent.append(this.createText(child));
|
|
191
211
|
}
|
|
192
212
|
else if (child instanceof CommentNode) {
|
|
193
|
-
|
|
213
|
+
fragmentParent.append(this.createComment(child));
|
|
194
214
|
}
|
|
195
|
-
else if (child instanceof
|
|
196
|
-
|
|
215
|
+
else if (child instanceof DomFragmentNode) {
|
|
216
|
+
fragmentParent.append(this.createDocumentFragment(child, contextStack, parentNode));
|
|
197
217
|
}
|
|
198
218
|
}
|
|
199
219
|
createElementByTagName(node) {
|
|
@@ -221,28 +241,59 @@ export class ComponentRender {
|
|
|
221
241
|
}
|
|
222
242
|
return element;
|
|
223
243
|
}
|
|
224
|
-
createElement(node, contextStack) {
|
|
244
|
+
createElement(node, contextStack, parentNode) {
|
|
225
245
|
const element = this.createElementByTagName(node);
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (node.
|
|
231
|
-
|
|
232
|
-
|
|
246
|
+
const elementStack = contextStack.copyStack();
|
|
247
|
+
const elementScope = isHTMLComponent(element) ? element._viewScope : elementStack.pushBlockReactiveScopeFor({ 'this': element });
|
|
248
|
+
elementStack.pushScope(elementScope);
|
|
249
|
+
const subscriptions = [];
|
|
250
|
+
if (node.attributeDirectives?.length) {
|
|
251
|
+
node.attributeDirectives.forEach(directiveNode => {
|
|
252
|
+
const directiveRef = ClassRegistryProvider.getDirectiveRef(directiveNode.name);
|
|
253
|
+
if (directiveRef && directiveRef.modelClass.prototype instanceof AttributeDirective) {
|
|
254
|
+
const directive = new directiveRef.modelClass(element);
|
|
255
|
+
const stack = contextStack.copyStack();
|
|
256
|
+
stack.pushBlockReactiveScopeFor({ 'this': directive });
|
|
257
|
+
const directiveSubscriptions = this.initDirectiveAttributes(directive, directiveNode, stack);
|
|
258
|
+
subscriptions.push(...directiveSubscriptions);
|
|
259
|
+
if (isOnInit(directive)) {
|
|
260
|
+
directive.onInit();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
const attributesSubscriptions = this.initAttribute(element, node, elementStack);
|
|
266
|
+
subscriptions.push(...attributesSubscriptions);
|
|
267
|
+
const eventName = getInputEventName(element);
|
|
268
|
+
let listener;
|
|
269
|
+
if (eventName) {
|
|
270
|
+
const inputScope = elementScope.getScopeOrCreat('this');
|
|
271
|
+
listener = (event) => inputScope.emit('value', element.value);
|
|
272
|
+
element.addEventListener(eventName, listener);
|
|
273
|
+
}
|
|
274
|
+
const removeSubscription = this.nativeElementMutation.subscribeOnRemoveNode(parentNode, element, () => {
|
|
275
|
+
removeSubscription.unsubscribe();
|
|
276
|
+
listener && element.removeEventListener(eventName, listener);
|
|
277
|
+
subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
278
|
+
});
|
|
279
|
+
const templateRefName = node.templateRefName;
|
|
280
|
+
if (templateRefName) {
|
|
281
|
+
Reflect.set(this.view, templateRefName.name, element);
|
|
282
|
+
const view = this.componentRef.viewChild.find(child => child.selector === templateRefName.name);
|
|
233
283
|
if (view) {
|
|
234
284
|
Reflect.set(this.view._model, view.modelName, element);
|
|
235
285
|
}
|
|
236
286
|
}
|
|
237
287
|
if (node.children) {
|
|
238
288
|
for (const child of node.children) {
|
|
239
|
-
this.appendChildToParent(element, child,
|
|
289
|
+
this.appendChildToParent(element, child, elementStack, element);
|
|
240
290
|
}
|
|
241
291
|
}
|
|
242
292
|
return element;
|
|
243
293
|
}
|
|
244
294
|
initAttribute(element, node, contextStack) {
|
|
245
|
-
|
|
295
|
+
const subscriptions = [];
|
|
296
|
+
if (node.attributes?.length) {
|
|
246
297
|
node.attributes.forEach(attr => {
|
|
247
298
|
const isAttr = hasAttr(element, attr.name);
|
|
248
299
|
if (isAttr) {
|
|
@@ -261,24 +312,28 @@ export class ComponentRender {
|
|
|
261
312
|
}
|
|
262
313
|
});
|
|
263
314
|
}
|
|
264
|
-
if (node.twoWayBinding) {
|
|
315
|
+
if (node.twoWayBinding?.length) {
|
|
265
316
|
node.twoWayBinding.forEach(attr => {
|
|
266
|
-
|
|
317
|
+
const sub = attr.expression.subscribe(contextStack);
|
|
318
|
+
subscriptions.push(...sub);
|
|
319
|
+
attr.expression.get(contextStack);
|
|
267
320
|
});
|
|
268
321
|
}
|
|
269
|
-
if (node.inputs) {
|
|
322
|
+
if (node.inputs?.length) {
|
|
270
323
|
node.inputs.forEach(attr => {
|
|
271
|
-
|
|
324
|
+
const sub = attr.expression.subscribe(contextStack, attr.pipelineNames);
|
|
325
|
+
subscriptions.push(...sub);
|
|
326
|
+
attr.expression.get(contextStack);
|
|
272
327
|
});
|
|
273
328
|
}
|
|
274
|
-
if (node.outputs) {
|
|
329
|
+
if (node.outputs?.length) {
|
|
275
330
|
node.outputs.forEach(event => {
|
|
276
331
|
let listener;
|
|
277
332
|
if (typeof event.value === 'string') {
|
|
278
333
|
listener = ($event) => {
|
|
279
334
|
const stack = contextStack.copyStack();
|
|
280
335
|
stack.pushBlockScopeFor({ $event });
|
|
281
|
-
event.expression.get(stack, this.view.
|
|
336
|
+
event.expression.get(stack, this.view._proxyModel);
|
|
282
337
|
};
|
|
283
338
|
}
|
|
284
339
|
else {
|
|
@@ -287,84 +342,52 @@ export class ComponentRender {
|
|
|
287
342
|
element.addEventListener(event.name, listener);
|
|
288
343
|
});
|
|
289
344
|
}
|
|
290
|
-
if (node.templateAttrs) {
|
|
345
|
+
if (node.templateAttrs?.length) {
|
|
291
346
|
node.templateAttrs.forEach(attr => {
|
|
292
|
-
|
|
347
|
+
const sub = attr.expression.subscribe(contextStack);
|
|
348
|
+
subscriptions.push(...sub);
|
|
349
|
+
attr.expression.get(contextStack);
|
|
293
350
|
});
|
|
294
351
|
}
|
|
352
|
+
return subscriptions;
|
|
295
353
|
}
|
|
296
|
-
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
if (context) {
|
|
307
|
-
if (AsyncPipeProvider.AsyncPipeContext === context) {
|
|
308
|
-
const pipe = contextStack.get(eventName);
|
|
309
|
-
subscribe1way(pipe, eventName, callback, object, attrName);
|
|
310
|
-
if (isOnDestroy(pipe)) {
|
|
311
|
-
this.view._model.subscribeModel('destroy', () => pipe.onDestroy());
|
|
312
|
-
}
|
|
313
|
-
const pipeContext = {};
|
|
314
|
-
pipeContext[eventName] = pipe.transform.bind(pipe);
|
|
315
|
-
contextStack.pushBlockScopeFor(pipeContext);
|
|
316
|
-
}
|
|
317
|
-
else if (PipeProvider.PipeContext !== context) {
|
|
318
|
-
subscribe1way(context, eventName, callback, object, attrName);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
bind2Way(element, attr, contextStack) {
|
|
324
|
-
const callback1 = () => {
|
|
325
|
-
attr.expression.get(contextStack);
|
|
326
|
-
};
|
|
327
|
-
const callback2 = () => {
|
|
328
|
-
attr.callbackExpression.get(contextStack);
|
|
329
|
-
};
|
|
330
|
-
attr.expression.events().forEach(eventName => {
|
|
331
|
-
const context = contextStack.findScope(eventName)?.getContext();
|
|
332
|
-
if (context) {
|
|
333
|
-
if (AsyncPipeProvider.AsyncPipeContext === context) {
|
|
334
|
-
const pipe = contextStack.get(eventName);
|
|
335
|
-
subscribe2way(pipe, eventName, callback1, element, attr.name, callback2);
|
|
336
|
-
if (isOnDestroy(pipe)) {
|
|
337
|
-
this.view._model.subscribeModel('destroy', () => pipe.onDestroy());
|
|
338
|
-
}
|
|
339
|
-
const pipeContext = {};
|
|
340
|
-
pipeContext[eventName] = pipe.transform.bind(pipe);
|
|
341
|
-
contextStack.pushBlockScopeFor(pipeContext);
|
|
342
|
-
}
|
|
343
|
-
else if (PipeProvider.PipeContext !== context) {
|
|
344
|
-
subscribe2way(context, eventName, callback1, element, attr.name, callback2);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
callback1();
|
|
349
|
-
const changeEventName = getChangeEventName(element, attr.name);
|
|
350
|
-
if ((changeEventName === 'input' || changeEventName === 'change')
|
|
351
|
-
&& isModel(element)) {
|
|
352
|
-
element.addEventListener(changeEventName, () => {
|
|
353
|
-
element.emitChangeModel(attr.name);
|
|
354
|
+
initDirectiveAttributes(directive, node, contextStack) {
|
|
355
|
+
const subscriptions = [];
|
|
356
|
+
if (node.attributes?.length) {
|
|
357
|
+
node.attributes.forEach(attr => Reflect.set(directive, attr.name, attr.value));
|
|
358
|
+
}
|
|
359
|
+
if (node.twoWayBinding?.length) {
|
|
360
|
+
node.twoWayBinding.forEach(attr => {
|
|
361
|
+
const sub = attr.expression.subscribe(contextStack);
|
|
362
|
+
subscriptions.push(...sub);
|
|
363
|
+
attr.expression.get(contextStack);
|
|
354
364
|
});
|
|
355
365
|
}
|
|
356
|
-
|
|
366
|
+
if (node.inputs?.length) {
|
|
367
|
+
node.inputs.forEach(attr => {
|
|
368
|
+
const sub = attr.expression.subscribe(contextStack, attr.pipelineNames);
|
|
369
|
+
subscriptions.push(...sub);
|
|
370
|
+
attr.expression.get(contextStack);
|
|
371
|
+
});
|
|
357
372
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
373
|
+
if (node.outputs?.length) {
|
|
374
|
+
node.outputs.forEach(event => {
|
|
375
|
+
const listener = ($event) => {
|
|
376
|
+
const stack = contextStack.copyStack();
|
|
377
|
+
stack.pushBlockScopeFor({ $event });
|
|
378
|
+
event.expression.get(stack, this.view._proxyModel);
|
|
379
|
+
};
|
|
380
|
+
directive[event.name].subscribe(listener);
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (node.templateAttrs?.length) {
|
|
384
|
+
node.templateAttrs.forEach(attr => {
|
|
385
|
+
const sub = attr.expression.subscribe(contextStack);
|
|
386
|
+
subscriptions.push(...sub);
|
|
387
|
+
attr.expression.get(contextStack);
|
|
366
388
|
});
|
|
367
389
|
}
|
|
390
|
+
return subscriptions;
|
|
368
391
|
}
|
|
369
392
|
}
|
|
370
393
|
//# sourceMappingURL=render.js.map
|
package/view/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/core/view/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExpressionNode, Stack } from '@ibyar/expressions';\nimport {\n\tCommentNode, DOMDirectiveNode,\n\tDOMElementNode, DOMFragmentNode, DOMNode,\n\tisTagNameNative, isValidCustomElementName,\n\tLiveAttribute, LiveTextContent, TextContent\n} from '@ibyar/elements';\nimport { ComponentRef, ListenerRef } from '../component/component.js';\nimport { ElementMutation } from './mutation.js';\nimport { HTMLComponent, isHTMLComponent } from '../component/custom-element.js';\nimport { documentStack } from '../context/stack.js';\nimport { ClassRegistryProvider } from '../providers/provider.js';\nimport { EventEmitter } from '../component/events.js';\nimport { isOnDestroy, isOnInit } from '../component/lifecycle.js';\nimport { hasAttr } from '../utils/elements-util.js';\nimport {\n\taddChangeListener, isModel, Model,\n\tSourceFollowerCallback, subscribe1way, subscribe2way\n} from '../model/change-detection.js';\nimport { AsyncPipeProvider, PipeProvider, PipeTransform } from '../pipe/pipe.js';\nimport { ElementReactiveScope } from '../directive/providers.js';\n\nfunction getChangeEventName(element: HTMLElement, elementAttr: string): 'input' | 'change' | string {\n\tif (elementAttr === 'value') {\n\t\tif (element instanceof HTMLInputElement) {\n\t\t\treturn 'input';\n\t\t} else if (element instanceof HTMLSelectElement\n\t\t\t|| element instanceof HTMLTextAreaElement) {\n\t\t\treturn 'change';\n\t\t}\n\t}\n\treturn elementAttr;\n}\nexport class ComponentRender<T> {\n\tcomponentRef: ComponentRef<T>;\n\ttemplate: DOMNode<ExpressionNode>;\n\tnativeElementMutation: ElementMutation;\n\tcontextStack: Stack;\n\ttemplateRefMap = new Map<string, DOMElementNode<ExpressionNode>>();\n\tconstructor(public view: HTMLComponent<T>) {\n\t\tthis.componentRef = this.view.getComponentRef();\n\t\tthis.contextStack = documentStack.copyStack();\n\t\tthis.contextStack.pushFunctionScope(); // to protect documentStack\n\t\tthis.contextStack.pushScope(this.view._viewScope);\n\t\tthis.contextStack.pushScope(this.view._modelScope);\n\t}\n\tinitView(): void {\n\t\tif (this.componentRef.template) {\n\t\t\tif (typeof this.componentRef.template === 'function') {\n\t\t\t\tthis.template = this.componentRef.template(this.view._model);\n\t\t\t} else {\n\t\t\t\tthis.template = this.componentRef.template;\n\t\t\t}\n\n\t\t\tlet rootRef: HTMLElement | ShadowRoot;\n\t\t\tif (this.componentRef.isShadowDom) {\n\t\t\t\tif (this.view.shadowRoot /* OPEN MODE */) {\n\t\t\t\t\trootRef = this.view.shadowRoot;\n\t\t\t\t} else /* CLOSED MODE*/ {\n\t\t\t\t\trootRef = Reflect.get(this.view, '_shadowRoot') as ShadowRoot;\n\t\t\t\t\tReflect.deleteProperty(this.view, '_shadowRoot');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trootRef = this.view;\n\t\t\t}\n\t\t\tthis.initTemplateRefMap(this.template);\n\t\t\tconst rootFragment = document.createDocumentFragment();\n\t\t\tthis.appendChildToParent(rootFragment, this.template, this.contextStack);\n\t\t\trootRef.append(rootFragment);\n\t\t}\n\t}\n\tisTemplateRefName(template: DOMNode<ExpressionNode>): template is DOMElementNode<ExpressionNode> {\n\t\tif (template instanceof DOMElementNode) {\n\t\t\tif (template.tagName === 'template' && template.templateRefName) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tinitTemplateRefMap(domNode: DOMNode<ExpressionNode>) {\n\t\tif (domNode instanceof DOMElementNode || domNode instanceof DOMDirectiveNode || domNode instanceof DOMFragmentNode) {\n\t\t\tif (domNode.children) {\n\t\t\t\tconst toRemove: { index: number, template: DOMElementNode<ExpressionNode> }[] = [];\n\t\t\t\tfor (let index = 0; index < domNode.children.length; index++) {\n\t\t\t\t\tconst child = domNode.children[index];\n\t\t\t\t\tif (this.isTemplateRefName(child)) {\n\t\t\t\t\t\ttoRemove.unshift({ index, template: child });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.initTemplateRefMap(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttoRemove.forEach(info => {\n\t\t\t\t\tthis.templateRefMap.set(info.template.templateRefName.name, info.template);\n\t\t\t\t\tdomNode.children.splice(info.index, 1);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tinitHostListener(): void {\n\t\tthis.componentRef.hostListeners?.forEach(\n\t\t\tlistener => this.handelHostListener(listener)\n\t\t);\n\t}\n\thandelHostListener(listener: ListenerRef) {\n\t\tlet eventName: string = listener.eventName, source: HTMLElement | Window;\n\t\tif (listener.eventName.includes(':')) {\n\t\t\tconst eventSource = eventName.substring(0, eventName.indexOf(':'));\n\t\t\teventName = eventName.substring(eventName.indexOf(':') + 1);\n\t\t\tif ('window' === eventSource.toLowerCase()) {\n\t\t\t\tsource = window;\n\t\t\t\tthis.addNativeEventListener(source, eventName, (event: any) => {\n\t\t\t\t\tthis.view._model[listener.modelCallbackName](event);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} else if (eventSource in this.view) {\n\t\t\t\tsource = Reflect.get(this.view, eventSource);\n\t\t\t\tif (!Reflect.has(source, '_model')) {\n\t\t\t\t\tthis.addNativeEventListener(source, eventName, (event: any) => {\n\t\t\t\t\t\tthis.view._model[listener.modelCallbackName](event);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsource = this.view;\n\t\t\t}\n\t\t} else {\n\t\t\tsource = this.view;\n\t\t}\n\t\tconst sourceModel = Reflect.get(source, '_model') as Model & { [key: string]: EventEmitter<any> };\n\t\tconst output = ClassRegistryProvider.hasOutput(sourceModel, eventName);\n\t\tif (output) {\n\t\t\tsourceModel[output.modelProperty].subscribe((value: any) => {\n\t\t\t\tthis.view._model[listener.modelCallbackName](value);\n\t\t\t});\n\t\t}\n\t\telse if (Reflect.has(source, 'on' + eventName)) {\n\t\t\tthis.addNativeEventListener(source, eventName, (event: any) => {\n\t\t\t\tthis.view._model[listener.modelCallbackName](event);\n\t\t\t});\n\t\t}\n\t\t// else if (this.componentRef.encapsulation === 'template' && !this.view.hasParentComponent()) {\n\t\t// \tthis.addNativeEventListener(this.view, eventName, eventCallback);\n\t\t// }\n\t\telse {\n\t\t\t// listen to internal changes\n\t\t\t// TODO: need to resolve parameter\n\t\t\taddChangeListener(sourceModel, eventName, () => this.view._model[listener.modelCallbackName]());\n\t\t}\n\t}\n\taddNativeEventListener(source: HTMLElement | Window, eventName: string, funcCallback: Function) {\n\t\tsource.addEventListener(eventName, (event: Event) => {\n\t\t\tfuncCallback.call(this.view._model, event);\n\t\t});\n\t}\n\tgetElementByName(name: string) {\n\t\treturn Reflect.get(this.view, name);\n\t}\n\tcreateDirective(directive: DOMDirectiveNode<ExpressionNode>, comment: Comment, directiveStack: Stack): void {\n\t\tconst directiveRef = ClassRegistryProvider.getDirectiveRef<T>(directive.directiveName);\n\t\tif (directiveRef) {\n\t\t\t// structural directive selector\n\t\t\tconst structural = new directiveRef.modelClass(this, comment, directive, directiveStack.copyStack());\n\t\t\tif (isOnInit(structural)) {\n\t\t\t\tstructural.onInit();\n\t\t\t}\n\t\t\tif (isOnDestroy(structural)) {\n\t\t\t\tthis.view._model.subscribeModel('destroy', () => structural.onDestroy());\n\t\t\t}\n\t\t} else {\n\t\t\t// didn't find directive or it is not define yet.\n\t\t\t// class registry should have 'when defined' callback\n\t\t}\n\t}\n\tcreateComment(node: CommentNode): Comment {\n\t\treturn document.createComment(`${node.comment}`);\n\t}\n\tcreateText(node: TextContent): Text {\n\t\treturn new Text(node.value);\n\t}\n\tcreateLiveText(textNode: LiveTextContent<ExpressionNode>, contextStack: Stack): Text {\n\t\tconst liveText = new Text('');\n\t\tcontextStack = contextStack.copyStack();\n\t\tcontextStack.pushBlockScopeFor({ this: liveText });\n\t\tthis.bind1Way(liveText, textNode, contextStack);\n\t\treturn liveText;\n\t}\n\tcreateDocumentFragment(node: DOMFragmentNode<ExpressionNode>, contextStack: Stack): DocumentFragment {\n\t\tconst fragment = document.createDocumentFragment();\n\t\tnode.children.forEach(child => this.appendChildToParent(fragment, child, contextStack));\n\t\treturn fragment;\n\t}\n\tappendChildToParent(parent: HTMLElement | DocumentFragment, child: DOMNode<ExpressionNode>, contextStack: Stack) {\n\t\tif (child instanceof DOMElementNode) {\n\t\t\tparent.append(this.createElement(child, contextStack));\n\t\t} else if (child instanceof DOMDirectiveNode) {\n\t\t\tconst comment = document.createComment(`start ${child.directiveName}: ${child.directiveValue}`);\n\t\t\tparent.append(comment);\n\t\t\tconst lastComment = document.createComment(`end ${child.directiveName}: ${child.directiveValue}`);\n\t\t\tcomment.after(lastComment);\n\t\t\tthis.createDirective(child, comment, contextStack);\n\t\t} else if (child instanceof LiveTextContent) {\n\t\t\tparent.append(this.createLiveText(child, contextStack));\n\t\t} else if (child instanceof TextContent) {\n\t\t\tparent.append(this.createText(child));\n\t\t} else if (child instanceof CommentNode) {\n\t\t\tparent.append(this.createComment(child));\n\t\t} else if (child instanceof DOMFragmentNode) {\n\t\t\tparent.append(this.createDocumentFragment(child, contextStack));\n\t\t}\n\t}\n\tcreateElementByTagName(node: DOMElementNode<ExpressionNode>): HTMLElement {\n\t\tlet element: HTMLElement;\n\t\tif (isValidCustomElementName(node.tagName)) {\n\t\t\tconst ViewClass = customElements.get(node.tagName) as ((new () => HTMLElement) | undefined);\n\t\t\tif (ViewClass) {\n\t\t\t\telement = new ViewClass();\n\t\t\t} else {\n\t\t\t\telement = document.createElement(node.tagName);\n\t\t\t\tif (element.constructor.name === 'HTMLElement') {\n\t\t\t\t\tcustomElements.whenDefined(node.tagName).then(() => customElements.upgrade(element));\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (isTagNameNative(node.tagName)) {\n\t\t\t// native tags // and custom tags can be used her\n\t\t\telement = document.createElement(node.tagName, node.is ? { is: node.is } : undefined);\n\t\t} else {\n\t\t\t// html unknown element\n\t\t\telement = document.createElement(node.tagName);\n\t\t}\n\t\tif (isHTMLComponent(element)) {\n\t\t\telement.setParentComponent(this.view);\n\t\t}\n\t\treturn element;\n\t}\n\tcreateElement(node: DOMElementNode<ExpressionNode>, contextStack: Stack): HTMLElement {\n\t\tconst element = this.createElementByTagName(node);\n\t\tconst elContext = isHTMLComponent(element) ? element._viewScope : new ElementReactiveScope(element);\n\t\tcontextStack = contextStack.copyStack();\n\t\tcontextStack.pushScope(elContext);\n\t\tthis.initAttribute(element, node, contextStack);\n\t\tif (node.templateRefName) {\n\t\t\tReflect.set(this.view, node.templateRefName.name, element);\n\t\t\tconst view = this.componentRef.viewChild.find(child => child.selector === node.templateRefName.name);\n\t\t\tif (view) {\n\t\t\t\tReflect.set(this.view._model, view.modelName, element);\n\t\t\t}\n\t\t}\n\t\tif (node.children) {\n\t\t\tfor (const child of node.children) {\n\t\t\t\tthis.appendChildToParent(element, child, contextStack);\n\t\t\t}\n\t\t}\n\t\treturn element;\n\t}\n\tinitAttribute(element: HTMLElement, node: DOMElementNode<ExpressionNode>, contextStack: Stack): void {\n\t\tif (node.attributes) {\n\t\t\tnode.attributes.forEach(attr => {\n\t\t\t\t/**\n\t\t\t\t * <input id=\"23\" name=\"person-name\" />\n\t\t\t\t */\n\t\t\t\tconst isAttr = hasAttr(element, attr.name);\n\t\t\t\tif (isAttr) {\n\t\t\t\t\tif (attr.value === false) {\n\t\t\t\t\t\telement.removeAttribute(attr.name);\n\t\t\t\t\t} else if (attr.value === true) {\n\t\t\t\t\t\telement.setAttribute(attr.name, '');\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.setAttribute(attr.name, attr.value as string);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tReflect.set(element, attr.name, attr.value);\n\t\t\t\t}\n\t\t\t\t// (attr.node as ExpressionNode).set(contextStack, attr.value);\n\t\t\t});\n\t\t}\n\t\tif (node.twoWayBinding) {\n\t\t\tnode.twoWayBinding.forEach(attr => {\n\t\t\t\tthis.bind2Way(element, attr, contextStack);\n\t\t\t});\n\t\t}\n\t\tif (node.inputs) {\n\t\t\tnode.inputs.forEach(attr => {\n\t\t\t\tthis.bind1Way(element, attr, contextStack);\n\t\t\t});\n\t\t}\n\t\tif (node.outputs) {\n\t\t\tnode.outputs.forEach(event => {\n\t\t\t\tlet listener: Function;\n\t\t\t\t/**\n\t\t\t\t * <a (click)=\"onLinkClick($event)\"></a>\n\t\t\t\t * <a @click=\"onLinkClick($event)\"></a>\n\t\t\t\t * <input [(value)]=\"person.name\" />\n\t\t\t\t * <input (value)=\"person.name\" />\n\t\t\t\t * <!-- <input (value)=\"person.name = $event\" /> -->\n\t\t\t\t * \n\t\t\t\t * TODO: diff of event listener and back-way data binding\n\t\t\t\t */\n\t\t\t\tif (typeof event.value === 'string') {\n\t\t\t\t\tlistener = ($event: Event) => {\n\t\t\t\t\t\tconst stack = contextStack.copyStack();\n\t\t\t\t\t\tstack.pushBlockScopeFor({ $event });\n\t\t\t\t\t\tevent.expression.get(stack, this.view._model);\n\t\t\t\t\t};\n\t\t\t\t} else /* if (typeof event.sourceHandler === 'function')*/ {\n\t\t\t\t\t// let eventName: keyof HTMLElementEventMap = event.eventName;\n\t\t\t\t\tlistener = event.value;\n\t\t\t\t}\n\t\t\t\telement.addEventListener(event.name as any, listener as any);\n\t\t\t});\n\t\t}\n\t\tif (node.templateAttrs) {\n\t\t\tnode.templateAttrs.forEach(attr => {\n\t\t\t\tthis.bind1Way(element, attr, contextStack);\n\t\t\t});\n\t\t}\n\t}\n\n\tbind1Way(element: HTMLElement | Text, attr: LiveAttribute<ExpressionNode> | LiveTextContent<ExpressionNode>, contextStack: Stack) {\n\t\tconst callback = () => {\n\t\t\tattr.expression.get(contextStack);\n\t\t};\n\t\tthis.subscribeExpressionNode(attr.expression, contextStack, callback, element, attr.name);\n\t\tcallback();\n\t}\n\tsubscribeExpressionNode(node: ExpressionNode, contextStack: Stack, callback: SourceFollowerCallback, object?: object, attrName?: string) {\n\t\tnode.events().forEach(eventName => {\n\t\t\tconst context = contextStack.findScope(eventName)?.getContext();\n\t\t\tif (context) {\n\t\t\t\tif (AsyncPipeProvider.AsyncPipeContext === context) {\n\t\t\t\t\tconst pipe: PipeTransform<any, any> = contextStack.get(eventName);\n\t\t\t\t\tsubscribe1way(pipe, eventName, callback, object, attrName);\n\t\t\t\t\tif (isOnDestroy(pipe)) {\n\t\t\t\t\t\tthis.view._model.subscribeModel('destroy', () => pipe.onDestroy());\n\t\t\t\t\t}\n\t\t\t\t\tconst pipeContext: { [key: string]: Function; } = {};\n\t\t\t\t\tpipeContext[eventName] = pipe.transform.bind(pipe);\n\t\t\t\t\tcontextStack.pushBlockScopeFor(pipeContext);\n\t\t\t\t} else if (PipeProvider.PipeContext !== context) {\n\t\t\t\t\tsubscribe1way(context, eventName, callback, object, attrName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tbind2Way(element: HTMLElement, attr: LiveAttribute<ExpressionNode>, contextStack: Stack) {\n\t\tconst callback1 = () => {\n\t\t\tattr.expression.get(contextStack);\n\t\t};\n\t\tconst callback2 = () => {\n\t\t\tattr.callbackExpression.get(contextStack);\n\t\t};\n\t\tattr.expression.events().forEach(eventName => {\n\t\t\tconst context = contextStack.findScope(eventName)?.getContext();\n\t\t\tif (context) {\n\t\t\t\tif (AsyncPipeProvider.AsyncPipeContext === context) {\n\t\t\t\t\tconst pipe: PipeTransform<any, any> = contextStack.get(eventName);\n\t\t\t\t\tsubscribe2way(pipe, eventName, callback1, element, attr.name, callback2);\n\t\t\t\t\tif (isOnDestroy(pipe)) {\n\t\t\t\t\t\tthis.view._model.subscribeModel('destroy', () => pipe.onDestroy());\n\t\t\t\t\t}\n\t\t\t\t\tconst pipeContext: { [key: string]: Function } = {};\n\t\t\t\t\tpipeContext[eventName] = pipe.transform.bind(pipe);\n\t\t\t\t\tcontextStack.pushBlockScopeFor(pipeContext);\n\t\t\t\t} else if (PipeProvider.PipeContext !== context) {\n\t\t\t\t\tsubscribe2way(context, eventName, callback1, element, attr.name, callback2);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tcallback1();\n\t\tconst changeEventName = getChangeEventName(element, attr.name);\n\t\tif ((changeEventName === 'input' || changeEventName === 'change')\n\t\t\t&& isModel(element)) {\n\t\t\telement.addEventListener(changeEventName, () => {\n\t\t\t\telement.emitChangeModel(attr.name);\n\t\t\t});\n\t\t}\n\t\telse if (isHTMLComponent(element)) {\n\t\t\t// ignore, it is applied by default\n\t\t}\n\t\telse {\n\t\t\tif (!this.nativeElementMutation) {\n\t\t\t\tthis.nativeElementMutation = new ElementMutation();\n\t\t\t}\n\t\t\tthis.nativeElementMutation.subscribe(element, attr.name, () => {\n\t\t\t\tif (isModel(element)) {\n\t\t\t\t\telement.emitChangeModel(attr.name);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/core/view/render.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tReactiveScope, ScopeContext, ScopeSubscription, Stack\n} from '@ibyar/expressions';\nimport {\n\tCommentNode, DomStructuralDirectiveNode, DomStructuralDirectiveNodeUpgrade,\n\tDomElementNode, DomFragmentNode, DomNode, isLiveTextContent,\n\tisTagNameNative, isValidCustomElementName, LiveTextContent,\n\tTextContent, DomAttributeDirectiveNode\n} from '@ibyar/elements';\nimport { ComponentRef, ListenerRef } from '../component/component.js';\nimport { ElementMutation } from './mutation.js';\nimport { HTMLComponent, isHTMLComponent } from '../component/custom-element.js';\nimport { documentStack } from '../context/stack.js';\nimport { ClassRegistryProvider } from '../providers/provider.js';\nimport { EventEmitter } from '../component/events.js';\nimport { isOnDestroy, isOnInit } from '../component/lifecycle.js';\nimport { hasAttr } from '../utils/elements-util.js';\nimport { AttributeDirective, StructuralDirective } from '../directive/directive.js';\nimport { TemplateRef, TemplateRefImpl } from '../linker/template-ref.js';\nimport { ViewContainerRefImpl } from '../linker/view-container-ref.js';\n\nfunction getInputEventName(element: HTMLElement): 'input' | 'change' | undefined {\n\tswitch (true) {\n\t\tcase element instanceof HTMLInputElement:\n\t\t\treturn 'input';\n\t\tcase element instanceof HTMLTextAreaElement:\n\t\tcase element instanceof HTMLSelectElement:\n\t\t\treturn 'change';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\nexport class ComponentRender<T extends object> {\n\tcomponentRef: ComponentRef<T>;\n\ttemplate: DomNode;\n\tnativeElementMutation: ElementMutation;\n\tcontextStack: Stack;\n\ttemplateNameScope: ReactiveScope<{ [templateName: string]: TemplateRef }>;\n\n\tconstructor(public view: HTMLComponent<T>) {\n\t\tthis.componentRef = this.view.getComponentRef();\n\t\tthis.contextStack = documentStack.copyStack();\n\t\tthis.contextStack.pushScope<ScopeContext>(this.view._modelScope);\n\t\tthis.templateNameScope = this.contextStack.pushBlockReactiveScope();\n\t\tthis.nativeElementMutation = new ElementMutation();\n\t}\n\tinitView(): void {\n\t\tif (this.componentRef.template) {\n\t\t\tif (typeof this.componentRef.template === 'function') {\n\t\t\t\tthis.template = this.componentRef.template(this.view._model);\n\t\t\t} else {\n\t\t\t\tthis.template = this.componentRef.template;\n\t\t\t}\n\n\t\t\tlet rootRef: HTMLElement | ShadowRoot;\n\t\t\tif (this.componentRef.isShadowDom) {\n\t\t\t\tif (this.view.shadowRoot /* OPEN MODE */) {\n\t\t\t\t\trootRef = this.view.shadowRoot;\n\t\t\t\t} else /* CLOSED MODE*/ {\n\t\t\t\t\trootRef = Reflect.get(this.view, '_shadowRoot') as ShadowRoot;\n\t\t\t\t\tReflect.deleteProperty(this.view, '_shadowRoot');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trootRef = this.view;\n\t\t\t}\n\t\t\tthis.initTemplateRefMap(this.template);\n\t\t\tlet rootFragment: DocumentFragment;\n\t\t\tif (this.template instanceof DomFragmentNode) {\n\t\t\t\trootFragment = this.createDocumentFragment(this.template, this.contextStack, rootRef);\n\t\t\t} else {\n\t\t\t\trootFragment = document.createDocumentFragment();\n\t\t\t\tthis.appendChildToParent(rootFragment, this.template, this.contextStack, rootRef);\n\t\t\t}\n\t\t\trootRef.append(rootFragment);\n\t\t}\n\t}\n\tisTemplateRefName(template: DomNode): template is DomElementNode {\n\t\tif (template instanceof DomElementNode) {\n\t\t\tif (template.tagName === 'template' && template.templateRefName) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\tinitTemplateRefMap(domNode: DomNode) {\n\t\tif (domNode instanceof DomElementNode || domNode instanceof DomFragmentNode) {\n\t\t\tif (domNode.children) {\n\t\t\t\tfor (let index = 0; index < domNode.children.length; index++) {\n\t\t\t\t\tconst child = domNode.children[index];\n\t\t\t\t\tif (this.isTemplateRefName(child)) {\n\t\t\t\t\t\tthis.templateNameScope.set(child.templateRefName!.name, undefined);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.initTemplateRefMap(child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tinitHostListener(): void {\n\t\tthis.componentRef.hostListeners?.forEach(\n\t\t\tlistener => this.handelHostListener(listener)\n\t\t);\n\t}\n\thandelHostListener(listener: ListenerRef) {\n\t\tlet eventName: string = listener.eventName, source: HTMLElement | Window;\n\t\tif (listener.eventName.includes(':')) {\n\t\t\tconst eventSource = eventName.substring(0, eventName.indexOf(':'));\n\t\t\teventName = eventName.substring(eventName.indexOf(':') + 1);\n\t\t\tif ('window' === eventSource.toLowerCase()) {\n\t\t\t\tsource = window;\n\t\t\t\tthis.addNativeEventListener(source, eventName, (event: any) => {\n\t\t\t\t\t(this.view._model[listener.modelCallbackName] as Function).call(this.view._proxyModel, event);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} else if (eventSource in this.view) {\n\t\t\t\tsource = Reflect.get(this.view, eventSource);\n\t\t\t\tif (!Reflect.has(source, '_model')) {\n\t\t\t\t\tthis.addNativeEventListener(source, eventName, (event: any) => {\n\t\t\t\t\t\t(this.view._model[listener.modelCallbackName] as Function).call(this.view._proxyModel, event);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsource = this.view;\n\t\t\t}\n\t\t} else {\n\t\t\tsource = this.view;\n\t\t}\n\t\tconst sourceModel = Reflect.get(source, '_model') as { [key: string]: EventEmitter<any> };\n\t\tconst output = ClassRegistryProvider.hasOutput(sourceModel, eventName);\n\t\tif (output) {\n\t\t\tsourceModel[output.modelProperty].subscribe((value: any) => {\n\t\t\t\t(this.view._model[listener.modelCallbackName] as Function).call(this.view._proxyModel, value);\n\t\t\t});\n\t\t}\n\t\telse if (Reflect.has(source, 'on' + eventName)) {\n\t\t\tthis.addNativeEventListener(source, eventName, (event: any) => {\n\t\t\t\t(this.view._model[listener.modelCallbackName] as Function).call(this.view._proxyModel, event);\n\t\t\t});\n\t\t}\n\t\t// else if (this.componentRef.encapsulation === 'template' && !this.view.hasParentComponent()) {\n\t\t// \tthis.addNativeEventListener(this.view, eventName, eventCallback);\n\t\t// }\n\t\telse {\n\t\t\t// listen to internal changes\n\t\t\t// TODO: need to resolve parameter\n\t\t\t// addChangeListener(sourceModel, eventName, () => (this.view._model[listener.modelCallbackName] as Function).call(this.view._proxyModel));\n\t\t}\n\t}\n\taddNativeEventListener(source: HTMLElement | Window, eventName: string, funcCallback: Function) {\n\t\tsource.addEventListener(eventName, (event: Event) => {\n\t\t\tfuncCallback.call(this.view._proxyModel, event);\n\t\t});\n\t}\n\tgetElementByName(name: string) {\n\t\treturn Reflect.get(this.view, name);\n\t}\n\tcreateStructuralDirective(directive: DomStructuralDirectiveNode, comment: Comment, directiveStack: Stack, parentNode: Node): void {\n\t\tconst directiveRef = ClassRegistryProvider.getDirectiveRef<T>(directive.name);\n\t\tif (directiveRef) {\n\t\t\t// structural directive selector\n\t\t\tconst StructuralDirectiveClass = directiveRef.modelClass as typeof StructuralDirective;\n\t\t\tconst stack = directiveStack.copyStack();\n\t\t\tconst templateRef = new TemplateRefImpl(\n\t\t\t\tthis,\n\t\t\t\tdirective.node,\n\t\t\t\tstack,\n\t\t\t\t(directive as DomStructuralDirectiveNodeUpgrade).templateExpressions ?? []\n\t\t\t);\n\t\t\tconst viewContainerRef = new ViewContainerRefImpl(parentNode as Element, comment);\n\n\t\t\tconst structural = new StructuralDirectiveClass(\n\t\t\t\ttemplateRef,\n\t\t\t\tviewContainerRef,\n\t\t\t);\n\t\t\tstack.pushBlockReactiveScopeFor({ 'this': structural });\n\t\t\tconst subscriptions = this.initDirectiveAttributes(structural, directive, stack);\n\t\t\tconst removeSubscription = this.nativeElementMutation.subscribeOnRemoveNode(parentNode, comment, () => {\n\t\t\t\tremoveSubscription.unsubscribe();\n\t\t\t\tsubscriptions.forEach(subscription => subscription.unsubscribe());\n\t\t\t\tif (isOnDestroy(structural)) {\n\t\t\t\t\tstructural.onDestroy();\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (isOnInit(structural)) {\n\t\t\t\tstructural.onInit();\n\t\t\t}\n\t\t} else {\n\t\t\t// didn't find directive or it is not define yet.\n\t\t\t// class registry should have 'when defined' callback\n\t\t}\n\t}\n\tcreateComment(node: CommentNode): Comment {\n\t\treturn document.createComment(`${node.comment}`);\n\t}\n\tcreateText(node: TextContent): Text {\n\t\treturn new Text(node.value);\n\t}\n\tcreateLiveText(textNode: LiveTextContent, contextStack: Stack, parentNode: Node): Text {\n\t\tconst liveText = new Text('');\n\t\tcontextStack = contextStack.copyStack();\n\t\tcontextStack.pushBlockScopeFor({ this: liveText });\n\t\tconst subscriptions = textNode.expression.subscribe(contextStack, textNode.pipelineNames);\n\t\ttextNode.expression.get(contextStack);\n\t\tconst removeSubscription = this.nativeElementMutation.subscribeOnRemoveNode(parentNode, liveText, () => {\n\t\t\tremoveSubscription.unsubscribe();\n\t\t\tsubscriptions.forEach(subscription => subscription.unsubscribe());\n\t\t});\n\t\treturn liveText;\n\t}\n\tcreateDocumentFragment(node: DomFragmentNode, contextStack: Stack, parentNode: Node): DocumentFragment {\n\t\tconst fragment = document.createDocumentFragment();\n\t\tnode.children?.forEach(child => this.appendChildToParent(fragment, child, contextStack, parentNode));\n\t\treturn fragment;\n\t}\n\tappendChildToParent(fragmentParent: HTMLElement | DocumentFragment, child: DomNode, contextStack: Stack, parentNode: Node) {\n\t\tif (child instanceof DomElementNode) {\n\t\t\tif (this.isTemplateRefName(child)) {\n\t\t\t\tconst templateRefName = child.templateRefName!;\n\t\t\t\t// const oldRef = this.templateNameScope.get(templateRefName.name);\n\t\t\t\t// if (oldRef) {\n\t\t\t\t// \treturn;\n\t\t\t\t// }\n\t\t\t\t// TODO: extract template expression\n\t\t\t\tconst templateRef = new TemplateRefImpl(\n\t\t\t\t\tthis,\n\t\t\t\t\tnew DomFragmentNode(child.children),\n\t\t\t\t\tcontextStack.copyStack(),\n\t\t\t\t\t[]\n\t\t\t\t);\n\t\t\t\tthis.templateNameScope.set(templateRefName.name, templateRef);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfragmentParent.append(this.createElement(child, contextStack, parentNode));\n\t\t} else if (child instanceof DomStructuralDirectiveNode) {\n\t\t\tconst commentText = child.name + (typeof child.value == 'string' ? (' = ' + child.value) : '');\n\t\t\tconst comment = document.createComment(`start ${commentText}`);\n\t\t\tfragmentParent.append(comment);\n\t\t\tconst lastComment = document.createComment(`end ${commentText}`);\n\t\t\tcomment.after(lastComment);\n\t\t\tthis.createStructuralDirective(child, comment, contextStack, parentNode);\n\t\t} else if (isLiveTextContent(child)) {\n\t\t\tfragmentParent.append(this.createLiveText(child, contextStack, parentNode));\n\t\t} else if (child instanceof TextContent) {\n\t\t\tfragmentParent.append(this.createText(child));\n\t\t} else if (child instanceof CommentNode) {\n\t\t\tfragmentParent.append(this.createComment(child));\n\t\t} else if (child instanceof DomFragmentNode) {\n\t\t\tfragmentParent.append(this.createDocumentFragment(child, contextStack, parentNode));\n\t\t}\n\t}\n\tcreateElementByTagName(node: { tagName: string, is?: string }): HTMLElement {\n\t\tlet element: HTMLElement;\n\t\tif (isValidCustomElementName(node.tagName)) {\n\t\t\tconst ViewClass = customElements.get(node.tagName) as ((new () => HTMLElement) | undefined);\n\t\t\tif (ViewClass) {\n\t\t\t\telement = new ViewClass();\n\t\t\t} else {\n\t\t\t\telement = document.createElement(node.tagName);\n\t\t\t\tif (element.constructor.name === 'HTMLElement') {\n\t\t\t\t\tcustomElements.whenDefined(node.tagName).then(() => customElements.upgrade(element));\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (isTagNameNative(node.tagName)) {\n\t\t\t// native tags // and custom tags can be used her\n\t\t\telement = document.createElement(node.tagName, node.is ? { is: node.is } : undefined);\n\t\t} else {\n\t\t\t// html unknown element\n\t\t\telement = document.createElement(node.tagName);\n\t\t}\n\t\tif (isHTMLComponent(element)) {\n\t\t\telement.setParentComponent(this.view);\n\t\t}\n\t\treturn element;\n\t}\n\tcreateElement(node: DomElementNode, contextStack: Stack, parentNode: Node): HTMLElement {\n\t\tconst element = this.createElementByTagName(node);\n\t\tconst elementStack = contextStack.copyStack();\n\t\tconst elementScope = isHTMLComponent(element) ? element._viewScope : elementStack.pushBlockReactiveScopeFor({ 'this': element });\n\t\telementStack.pushScope<ScopeContext>(elementScope);\n\t\tconst subscriptions: ScopeSubscription<ScopeContext>[] = [];\n\t\tif (node.attributeDirectives?.length) {\n\t\t\tnode.attributeDirectives.forEach(directiveNode => {\n\t\t\t\tconst directiveRef = ClassRegistryProvider.getDirectiveRef<any>(directiveNode.name);\n\t\t\t\tif (directiveRef && directiveRef.modelClass.prototype instanceof AttributeDirective) {\n\t\t\t\t\tconst directive = new directiveRef.modelClass(element) as AttributeDirective;\n\t\t\t\t\tconst stack = contextStack.copyStack();\n\t\t\t\t\tstack.pushBlockReactiveScopeFor({ 'this': directive });\n\t\t\t\t\tconst directiveSubscriptions = this.initDirectiveAttributes(directive, directiveNode, stack);\n\t\t\t\t\tsubscriptions.push(...directiveSubscriptions);\n\t\t\t\t\tif (isOnInit(directive)) {\n\t\t\t\t\t\tdirective.onInit();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tconst attributesSubscriptions = this.initAttribute(element, node, elementStack);\n\t\tsubscriptions.push(...attributesSubscriptions);\n\t\tconst eventName = getInputEventName(element);\n\t\tlet listener: ((event: HTMLElementEventMap['input' | 'change']) => any) | undefined;\n\t\tif (eventName) {\n\t\t\tconst inputScope = elementScope.getScopeOrCreat('this');\n\t\t\tlistener = (event) => inputScope.emit('value', (element as HTMLInputElement).value);\n\t\t\telement.addEventListener(eventName, listener);\n\t\t}\n\t\tconst removeSubscription = this.nativeElementMutation.subscribeOnRemoveNode(parentNode, element, () => {\n\t\t\tremoveSubscription.unsubscribe();\n\t\t\tlistener && element.removeEventListener(eventName!, listener);\n\t\t\tsubscriptions.forEach(subscription => subscription.unsubscribe());\n\t\t});\n\n\t\tconst templateRefName = node.templateRefName;\n\t\tif (templateRefName) {\n\t\t\tReflect.set(this.view, templateRefName.name, element);\n\t\t\tconst view = this.componentRef.viewChild.find(child => child.selector === templateRefName.name);\n\t\t\tif (view) {\n\t\t\t\tReflect.set(this.view._model, view.modelName, element);\n\t\t\t}\n\t\t}\n\t\tif (node.children) {\n\t\t\tfor (const child of node.children) {\n\t\t\t\tthis.appendChildToParent(element, child, elementStack, element);\n\t\t\t}\n\t\t}\n\t\treturn element;\n\t}\n\tinitAttribute(element: HTMLElement, node: DomElementNode, contextStack: Stack): ScopeSubscription<ScopeContext>[] {\n\t\tconst subscriptions: ScopeSubscription<ScopeContext>[] = [];\n\t\tif (node.attributes?.length) {\n\t\t\tnode.attributes.forEach(attr => {\n\t\t\t\t/**\n\t\t\t\t * <input id=\"23\" name=\"person-name\" />\n\t\t\t\t */\n\t\t\t\tconst isAttr = hasAttr(element, attr.name);\n\t\t\t\tif (isAttr) {\n\t\t\t\t\tif (attr.value === false) {\n\t\t\t\t\t\telement.removeAttribute(attr.name);\n\t\t\t\t\t} else if (attr.value === true) {\n\t\t\t\t\t\telement.setAttribute(attr.name, '');\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.setAttribute(attr.name, attr.value as string);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tReflect.set(element, attr.name, attr.value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (node.twoWayBinding?.length) {\n\t\t\tnode.twoWayBinding.forEach(attr => {\n\t\t\t\tconst sub = attr.expression.subscribe(contextStack);\n\t\t\t\tsubscriptions.push(...sub);\n\t\t\t\tattr.expression.get(contextStack);\n\t\t\t});\n\t\t}\n\t\tif (node.inputs?.length) {\n\t\t\tnode.inputs.forEach(attr => {\n\t\t\t\tconst sub = attr.expression.subscribe(contextStack, attr.pipelineNames);\n\t\t\t\tsubscriptions.push(...sub);\n\t\t\t\tattr.expression.get(contextStack);\n\t\t\t});\n\t\t}\n\t\tif (node.outputs?.length) {\n\t\t\tnode.outputs.forEach(event => {\n\t\t\t\tlet listener: Function;\n\t\t\t\t/**\n\t\t\t\t * <a (click)=\"onLinkClick($event)\"></a>\n\t\t\t\t * <a @click=\"onLinkClick($event)\"></a>\n\t\t\t\t * <input [(value)]=\"person.name\" />\n\t\t\t\t * <input (value)=\"person.name\" />\n\t\t\t\t * <!-- <input (value)=\"person.name = $event\" /> -->\n\t\t\t\t * \n\t\t\t\t * TODO: diff of event listener and back-way data binding\n\t\t\t\t */\n\t\t\t\tif (typeof event.value === 'string') {\n\t\t\t\t\tlistener = ($event: Event) => {\n\t\t\t\t\t\tconst stack = contextStack.copyStack();\n\t\t\t\t\t\tstack.pushBlockScopeFor({ $event });\n\t\t\t\t\t\tevent.expression.get(stack, this.view._proxyModel);\n\t\t\t\t\t};\n\t\t\t\t} else /* if (typeof event.sourceHandler === 'function')*/ {\n\t\t\t\t\t// let eventName: keyof HTMLElementEventMap = event.eventName;\n\t\t\t\t\tlistener = event.value;\n\t\t\t\t}\n\t\t\t\telement.addEventListener(event.name as any, listener as any);\n\t\t\t});\n\t\t}\n\t\tif (node.templateAttrs?.length) {\n\t\t\tnode.templateAttrs.forEach(attr => {\n\t\t\t\tconst sub = attr.expression.subscribe(contextStack);\n\t\t\t\tsubscriptions.push(...sub);\n\t\t\t\tattr.expression.get(contextStack);\n\t\t\t});\n\t\t}\n\t\treturn subscriptions;\n\t}\n\n\tinitDirectiveAttributes(directive: StructuralDirective | AttributeDirective,\n\t\tnode: DomStructuralDirectiveNode | DomAttributeDirectiveNode, contextStack: Stack): ScopeSubscription<ScopeContext>[] {\n\t\tconst subscriptions: ScopeSubscription<ScopeContext>[] = [];\n\n\t\tif (node.attributes?.length) {\n\t\t\tnode.attributes.forEach(attr => Reflect.set(directive, attr.name, attr.value));\n\t\t}\n\t\tif (node.twoWayBinding?.length) {\n\t\t\tnode.twoWayBinding.forEach(attr => {\n\t\t\t\tconst sub = attr.expression.subscribe(contextStack);\n\t\t\t\tsubscriptions.push(...sub);\n\t\t\t\tattr.expression.get(contextStack);\n\t\t\t});\n\t\t}\n\t\tif (node.inputs?.length) {\n\t\t\tnode.inputs.forEach(attr => {\n\t\t\t\tconst sub = attr.expression.subscribe(contextStack, attr.pipelineNames);\n\t\t\t\tsubscriptions.push(...sub);\n\t\t\t\tattr.expression.get(contextStack);\n\t\t\t});\n\t\t}\n\t\tif (node.outputs?.length) {\n\t\t\tnode.outputs.forEach(event => {\n\t\t\t\tconst listener = ($event: Event) => {\n\t\t\t\t\tconst stack = contextStack.copyStack();\n\t\t\t\t\tstack.pushBlockScopeFor({ $event });\n\t\t\t\t\tevent.expression.get(stack, this.view._proxyModel);\n\t\t\t\t};\n\t\t\t\t((<any>directive)[event.name] as any).subscribe(listener);\n\t\t\t});\n\t\t}\n\t\tif (node.templateAttrs?.length) {\n\t\t\tnode.templateAttrs.forEach(attr => {\n\t\t\t\tconst sub = attr.expression.subscribe(contextStack);\n\t\t\t\tsubscriptions.push(...sub);\n\t\t\t\tattr.expression.get(contextStack);\n\t\t\t});\n\t\t}\n\t\treturn subscriptions;\n\t}\n\n}\n"]}
|
package/view/view.d.ts
CHANGED
|
@@ -11,6 +11,6 @@ export declare type ComponentModelClass = Constructable & {
|
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
13
|
export declare function isComponentModelClass(target: Constructable): target is ComponentModelClass;
|
|
14
|
-
export declare function addViewToModelClass<T>(modelClass: TypeOf<T>, selector: string, viewClass: TypeOf<HTMLComponent<T>>, htmlViewClassName: string): void;
|
|
14
|
+
export declare function addViewToModelClass<T extends object>(modelClass: TypeOf<T>, selector: string, viewClass: TypeOf<HTMLComponent<T>>, htmlViewClassName: string): void;
|
|
15
15
|
export declare function buildViewClassNameFromSelector(selector: string): string;
|
|
16
|
-
export declare function
|
|
16
|
+
export declare function getComponentView<T extends object>(modelClass: TypeOf<T>, selector?: string): TypeOf<HTMLComponent<T>> | undefined;
|