@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.
Files changed (65) hide show
  1. package/README.md +2 -3
  2. package/annotation/decorators.d.ts +2 -3
  3. package/annotation/decorators.js.map +1 -1
  4. package/binding/binding.expressions.d.ts +32 -0
  5. package/binding/binding.expressions.js +99 -0
  6. package/binding/binding.expressions.js.map +1 -0
  7. package/component/component.d.ts +3 -4
  8. package/component/component.js +5 -1
  9. package/component/component.js.map +1 -1
  10. package/component/custom-element.d.ts +15 -17
  11. package/component/custom-element.js.map +1 -1
  12. package/component/provider.d.ts +3 -0
  13. package/component/provider.js +16 -3
  14. package/component/provider.js.map +1 -1
  15. package/directive/directive.d.ts +6 -10
  16. package/directive/directive.js +3 -8
  17. package/directive/directive.js.map +1 -1
  18. package/directive/parser.d.ts +30 -0
  19. package/directive/parser.js +174 -0
  20. package/directive/parser.js.map +1 -0
  21. package/html/expression.d.ts +21 -2
  22. package/html/expression.js +81 -17
  23. package/html/expression.js.map +1 -1
  24. package/index.d.ts +3 -2
  25. package/index.js +3 -2
  26. package/index.js.map +1 -1
  27. package/linker/template-ref.d.ts +18 -0
  28. package/linker/template-ref.js +59 -0
  29. package/linker/template-ref.js.map +1 -0
  30. package/linker/view-container-ref.d.ts +39 -0
  31. package/linker/view-container-ref.js +82 -0
  32. package/linker/view-container-ref.js.map +1 -0
  33. package/linker/view-ref.d.ts +36 -0
  34. package/linker/view-ref.js +75 -0
  35. package/linker/view-ref.js.map +1 -0
  36. package/package.json +14 -6
  37. package/pipe/pipe.d.ts +17 -3
  38. package/pipe/pipe.js +33 -7
  39. package/pipe/pipe.js.map +1 -1
  40. package/providers/provider.d.ts +1 -1
  41. package/providers/provider.js +6 -3
  42. package/providers/provider.js.map +1 -1
  43. package/utils/elements-util.js +4 -1
  44. package/utils/elements-util.js.map +1 -1
  45. package/view/base-view.d.ts +1 -1
  46. package/view/base-view.js +41 -45
  47. package/view/base-view.js.map +1 -1
  48. package/view/mutation.d.ts +41 -6
  49. package/view/mutation.js +159 -24
  50. package/view/mutation.js.map +1 -1
  51. package/view/render.d.ts +22 -18
  52. package/view/render.js +164 -141
  53. package/view/render.js.map +1 -1
  54. package/view/view.d.ts +2 -2
  55. package/view/view.js +7 -12
  56. package/view/view.js.map +1 -1
  57. package/html/update.d.ts +0 -12
  58. package/html/update.js +0 -24
  59. package/html/update.js.map +0 -1
  60. package/model/change-detection.d.ts +0 -13
  61. package/model/change-detection.js +0 -76
  62. package/model/change-detection.js.map +0 -1
  63. package/utils/observable.d.ts +0 -8
  64. package/utils/observable.js +0 -34
  65. package/utils/observable.js.map +0 -1
package/view/render.js CHANGED
@@ -1,34 +1,32 @@
1
- import { CommentNode, DOMDirectiveNode, DOMElementNode, DOMFragmentNode, isTagNameNative, isValidCustomElementName, LiveTextContent, TextContent } from '@ibyar/elements';
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 { addChangeListener, isModel, subscribe1way, subscribe2way } from '../model/change-detection.js';
9
- import { AsyncPipeProvider, PipeProvider } from '../pipe/pipe.js';
10
- import { ElementReactiveScope } from '../directive/providers.js';
11
- function getChangeEventName(element, elementAttr) {
12
- if (elementAttr === 'value') {
13
- if (element instanceof HTMLInputElement) {
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
- else if (element instanceof HTMLSelectElement
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
- const rootFragment = document.createDocumentFragment();
56
- this.appendChildToParent(rootFragment, this.template, this.contextStack);
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 DOMElementNode) {
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 DOMElementNode || domNode instanceof DOMDirectiveNode || domNode instanceof DOMFragmentNode) {
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
- toRemove.unshift({ index, template: child });
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._model, event);
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
- createDirective(directive, comment, directiveStack) {
144
- const directiveRef = ClassRegistryProvider.getDirectiveRef(directive.directiveName);
141
+ createStructuralDirective(directive, comment, directiveStack, parentNode) {
142
+ const directiveRef = ClassRegistryProvider.getDirectiveRef(directive.name);
145
143
  if (directiveRef) {
146
- const structural = new directiveRef.modelClass(this, comment, directive, directiveStack.copyStack());
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
- this.bind1Way(liveText, textNode, contextStack);
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.forEach(child => this.appendChildToParent(fragment, child, contextStack));
185
+ node.children?.forEach(child => this.appendChildToParent(fragment, child, contextStack, parentNode));
173
186
  return fragment;
174
187
  }
175
- appendChildToParent(parent, child, contextStack) {
176
- if (child instanceof DOMElementNode) {
177
- parent.append(this.createElement(child, contextStack));
178
- }
179
- else if (child instanceof DOMDirectiveNode) {
180
- const comment = document.createComment(`start ${child.directiveName}: ${child.directiveValue}`);
181
- parent.append(comment);
182
- const lastComment = document.createComment(`end ${child.directiveName}: ${child.directiveValue}`);
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.createDirective(child, comment, contextStack);
204
+ this.createStructuralDirective(child, comment, contextStack, parentNode);
185
205
  }
186
- else if (child instanceof LiveTextContent) {
187
- parent.append(this.createLiveText(child, contextStack));
206
+ else if (isLiveTextContent(child)) {
207
+ fragmentParent.append(this.createLiveText(child, contextStack, parentNode));
188
208
  }
189
209
  else if (child instanceof TextContent) {
190
- parent.append(this.createText(child));
210
+ fragmentParent.append(this.createText(child));
191
211
  }
192
212
  else if (child instanceof CommentNode) {
193
- parent.append(this.createComment(child));
213
+ fragmentParent.append(this.createComment(child));
194
214
  }
195
- else if (child instanceof DOMFragmentNode) {
196
- parent.append(this.createDocumentFragment(child, contextStack));
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 elContext = isHTMLComponent(element) ? element._viewScope : new ElementReactiveScope(element);
227
- contextStack = contextStack.copyStack();
228
- contextStack.pushScope(elContext);
229
- this.initAttribute(element, node, contextStack);
230
- if (node.templateRefName) {
231
- Reflect.set(this.view, node.templateRefName.name, element);
232
- const view = this.componentRef.viewChild.find(child => child.selector === node.templateRefName.name);
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, contextStack);
289
+ this.appendChildToParent(element, child, elementStack, element);
240
290
  }
241
291
  }
242
292
  return element;
243
293
  }
244
294
  initAttribute(element, node, contextStack) {
245
- if (node.attributes) {
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
- this.bind2Way(element, attr, contextStack);
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
- this.bind1Way(element, attr, contextStack);
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._model);
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
- this.bind1Way(element, attr, contextStack);
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
- bind1Way(element, attr, contextStack) {
297
- const callback = () => {
298
- attr.expression.get(contextStack);
299
- };
300
- this.subscribeExpressionNode(attr.expression, contextStack, callback, element, attr.name);
301
- callback();
302
- }
303
- subscribeExpressionNode(node, contextStack, callback, object, attrName) {
304
- node.events().forEach(eventName => {
305
- const context = contextStack.findScope(eventName)?.getContext();
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
- else if (isHTMLComponent(element)) {
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
- else {
359
- if (!this.nativeElementMutation) {
360
- this.nativeElementMutation = new ElementMutation();
361
- }
362
- this.nativeElementMutation.subscribe(element, attr.name, () => {
363
- if (isModel(element)) {
364
- element.emitChangeModel(attr.name);
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
@@ -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 ComponentView<T>(modelClass: TypeOf<T>, selector?: string): TypeOf<HTMLComponent<T>> | undefined;
16
+ export declare function getComponentView<T extends object>(modelClass: TypeOf<T>, selector?: string): TypeOf<HTMLComponent<T>> | undefined;