@ibyar/core 0.4.0 → 0.5.1

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 (68) hide show
  1. package/README.md +1 -0
  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 +104 -0
  6. package/binding/binding.expressions.js.map +1 -0
  7. package/component/component.d.ts +3 -4
  8. package/component/component.js +5 -7
  9. package/component/component.js.map +1 -1
  10. package/component/custom-element.d.ts +12 -16
  11. package/component/custom-element.js.map +1 -1
  12. package/component/provider.d.ts +2 -2
  13. package/component/provider.js +3 -3
  14. package/component/provider.js.map +1 -1
  15. package/directive/directive.d.ts +8 -10
  16. package/directive/directive.js +4 -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 +82 -22
  23. package/html/expression.js.map +1 -1
  24. package/index.d.ts +3 -1
  25. package/index.js +3 -1
  26. package/index.js.map +1 -1
  27. package/linker/change-detector-ref.d.ts +7 -0
  28. package/linker/change-detector-ref.js +31 -0
  29. package/linker/change-detector-ref.js.map +1 -0
  30. package/linker/template-ref.d.ts +22 -0
  31. package/linker/template-ref.js +57 -0
  32. package/linker/template-ref.js.map +1 -0
  33. package/linker/view-container-ref.d.ts +41 -0
  34. package/linker/view-container-ref.js +82 -0
  35. package/linker/view-container-ref.js.map +1 -0
  36. package/linker/view-ref.d.ts +38 -0
  37. package/linker/view-ref.js +78 -0
  38. package/linker/view-ref.js.map +1 -0
  39. package/package.json +5 -5
  40. package/pipe/pipe.d.ts +26 -5
  41. package/pipe/pipe.js +41 -10
  42. package/pipe/pipe.js.map +1 -1
  43. package/providers/provider.d.ts +1 -1
  44. package/providers/provider.js +6 -3
  45. package/providers/provider.js.map +1 -1
  46. package/utils/elements-util.js +4 -1
  47. package/utils/elements-util.js.map +1 -1
  48. package/view/base-view.d.ts +1 -1
  49. package/view/base-view.js +34 -50
  50. package/view/base-view.js.map +1 -1
  51. package/view/mutation.d.ts +9 -1
  52. package/view/mutation.js +37 -6
  53. package/view/mutation.js.map +1 -1
  54. package/view/render.d.ts +24 -24
  55. package/view/render.js +145 -155
  56. package/view/render.js.map +1 -1
  57. package/view/view.d.ts +2 -2
  58. package/view/view.js +7 -10
  59. package/view/view.js.map +1 -1
  60. package/html/update.d.ts +0 -12
  61. package/html/update.js +0 -24
  62. package/html/update.js.map +0 -1
  63. package/model/change-detection.d.ts +0 -13
  64. package/model/change-detection.js +0 -100
  65. package/model/change-detection.js.map +0 -1
  66. package/view/events.d.ts +0 -2
  67. package/view/events.js +0 -25
  68. package/view/events.js.map +0 -1
package/view/render.js CHANGED
@@ -1,39 +1,31 @@
1
- import { CommentNode, DOMDirectiveNode, DOMElementNode, DOMFragmentNode, isTagNameNative, isValidCustomElementName, LiveTextContent, TextContent } from '@ibyar/elements';
2
- import { ElementMutation } from './mutation.js';
1
+ import { CommentNode, DomStructuralDirectiveNode, DomElementNode, DomFragmentNode, isLiveTextContent, isTagNameNative, isValidCustomElementName, TextContent } from '@ibyar/elements';
3
2
  import { isHTMLComponent } from '../component/custom-element.js';
4
3
  import { documentStack } from '../context/stack.js';
5
4
  import { ClassRegistryProvider } from '../providers/provider.js';
6
- import { isOnDestroy, isOnInit } from '../component/lifecycle.js';
5
+ import { isOnInit } from '../component/lifecycle.js';
7
6
  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
- import { findScopeMap } from './events.js';
12
- function getChangeEventName(element, elementAttr) {
13
- if (elementAttr === 'value') {
14
- if (element instanceof HTMLInputElement) {
7
+ import { AttributeDirective } from '../directive/directive.js';
8
+ import { TemplateRefImpl } from '../linker/template-ref.js';
9
+ import { ViewContainerRefImpl } from '../linker/view-container-ref.js';
10
+ function getInputEventName(element) {
11
+ switch (true) {
12
+ case element instanceof HTMLInputElement:
15
13
  return 'input';
16
- }
17
- else if (element instanceof HTMLSelectElement
18
- || element instanceof HTMLTextAreaElement) {
14
+ case element instanceof HTMLTextAreaElement:
15
+ case element instanceof HTMLSelectElement:
19
16
  return 'change';
20
- }
17
+ default:
18
+ return undefined;
21
19
  }
22
- return elementAttr;
23
20
  }
24
21
  export class ComponentRender {
25
- constructor(view) {
22
+ constructor(view, subscriptions) {
26
23
  this.view = view;
27
- this.templateRefMap = new Map();
24
+ this.subscriptions = subscriptions;
28
25
  this.componentRef = this.view.getComponentRef();
29
26
  this.contextStack = documentStack.copyStack();
30
- this.contextStack.pushFunctionScope();
31
- this.contextStack.pushScope(this.view._viewScope);
32
27
  this.contextStack.pushScope(this.view._modelScope);
33
- this.nativeElementMutation = new ElementMutation();
34
- this.view._model.subscribeModel('destroy', () => {
35
- this.nativeElementMutation.disconnect();
36
- });
28
+ this.templateNameScope = this.contextStack.pushBlockReactiveScope();
37
29
  }
38
30
  initView() {
39
31
  if (this.componentRef.template) {
@@ -57,13 +49,19 @@ export class ComponentRender {
57
49
  rootRef = this.view;
58
50
  }
59
51
  this.initTemplateRefMap(this.template);
60
- const rootFragment = document.createDocumentFragment();
61
- this.appendChildToParent(rootFragment, this.template, this.contextStack);
52
+ let rootFragment;
53
+ if (this.template instanceof DomFragmentNode) {
54
+ rootFragment = this.createDocumentFragment(this.template, this.contextStack, rootRef, this.subscriptions, this.view);
55
+ }
56
+ else {
57
+ rootFragment = document.createDocumentFragment();
58
+ this.appendChildToParent(rootFragment, this.template, this.contextStack, rootRef, this.subscriptions, this.view);
59
+ }
62
60
  rootRef.append(rootFragment);
63
61
  }
64
62
  }
65
63
  isTemplateRefName(template) {
66
- if (template instanceof DOMElementNode) {
64
+ if (template instanceof DomElementNode) {
67
65
  if (template.tagName === 'template' && template.templateRefName) {
68
66
  return true;
69
67
  }
@@ -71,22 +69,17 @@ export class ComponentRender {
71
69
  return false;
72
70
  }
73
71
  initTemplateRefMap(domNode) {
74
- if (domNode instanceof DOMElementNode || domNode instanceof DOMDirectiveNode || domNode instanceof DOMFragmentNode) {
72
+ if (domNode instanceof DomElementNode || domNode instanceof DomFragmentNode) {
75
73
  if (domNode.children) {
76
- const toRemove = [];
77
74
  for (let index = 0; index < domNode.children.length; index++) {
78
75
  const child = domNode.children[index];
79
76
  if (this.isTemplateRefName(child)) {
80
- toRemove.unshift({ index, template: child });
77
+ this.templateNameScope.set(child.templateRefName.name, undefined);
81
78
  }
82
79
  else {
83
80
  this.initTemplateRefMap(child);
84
81
  }
85
82
  }
86
- toRemove.forEach(info => {
87
- this.templateRefMap.set(info.template.templateRefName.name, info.template);
88
- domNode.children.splice(info.index, 1);
89
- });
90
83
  }
91
84
  }
92
85
  }
@@ -134,7 +127,6 @@ export class ComponentRender {
134
127
  });
135
128
  }
136
129
  else {
137
- addChangeListener(sourceModel, eventName, () => this.view._model[listener.modelCallbackName].call(this.view._proxyModel));
138
130
  }
139
131
  }
140
132
  addNativeEventListener(source, eventName, funcCallback) {
@@ -145,18 +137,20 @@ export class ComponentRender {
145
137
  getElementByName(name) {
146
138
  return Reflect.get(this.view, name);
147
139
  }
148
- createDirective(directive, comment, directiveStack, parentNode) {
149
- const directiveRef = ClassRegistryProvider.getDirectiveRef(directive.directiveName);
140
+ createStructuralDirective(directive, comment, directiveStack, parentNode, host) {
141
+ const directiveRef = ClassRegistryProvider.getDirectiveRef(directive.name);
150
142
  if (directiveRef) {
151
- const structural = new directiveRef.modelClass(this, comment, directive, directiveStack.copyStack());
143
+ const stack = directiveStack.copyStack();
144
+ const templateRef = new TemplateRefImpl(this, directive.node, stack, directive.templateExpressions ?? []);
145
+ const viewContainerRef = new ViewContainerRefImpl(parentNode, comment);
146
+ const StructuralDirectiveClass = directiveRef.modelClass;
147
+ const structural = new StructuralDirectiveClass(templateRef, viewContainerRef, host);
148
+ templateRef.host = structural;
149
+ stack.pushBlockReactiveScopeFor({ 'this': structural });
150
+ const subscriptions = this.initDirectiveAttributes(structural, directive, stack);
152
151
  if (isOnInit(structural)) {
153
152
  structural.onInit();
154
153
  }
155
- if (isOnDestroy(structural)) {
156
- this.nativeElementMutation.subscribeOnRemoveNode(parentNode, comment, () => {
157
- structural.onDestroy();
158
- });
159
- }
160
154
  }
161
155
  else {
162
156
  }
@@ -167,40 +161,49 @@ export class ComponentRender {
167
161
  createText(node) {
168
162
  return new Text(node.value);
169
163
  }
170
- createLiveText(textNode, contextStack) {
164
+ createLiveText(textNode, contextStack, parentNode, subscriptions) {
171
165
  const liveText = new Text('');
172
166
  contextStack = contextStack.copyStack();
173
167
  contextStack.pushBlockScopeFor({ this: liveText });
174
- this.bind1Way(liveText, textNode, contextStack);
168
+ const textSubscriptions = textNode.expression.subscribe(contextStack, textNode.pipelineNames);
169
+ subscriptions.push(...textSubscriptions);
170
+ textNode.expression.get(contextStack);
175
171
  return liveText;
176
172
  }
177
- createDocumentFragment(node, contextStack) {
173
+ createDocumentFragment(node, contextStack, parentNode, subscriptions, host) {
178
174
  const fragment = document.createDocumentFragment();
179
- node.children.forEach(child => this.appendChildToParent(fragment, child, contextStack));
175
+ node.children?.forEach(child => this.appendChildToParent(fragment, child, contextStack, parentNode, subscriptions, host));
180
176
  return fragment;
181
177
  }
182
- appendChildToParent(parent, child, contextStack) {
183
- if (child instanceof DOMElementNode) {
184
- parent.append(this.createElement(child, contextStack));
185
- }
186
- else if (child instanceof DOMDirectiveNode) {
187
- const comment = document.createComment(`start ${child.directiveName}: ${child.directiveValue}`);
188
- parent.append(comment);
189
- const lastComment = document.createComment(`end ${child.directiveName}: ${child.directiveValue}`);
178
+ appendChildToParent(fragmentParent, child, contextStack, parentNode, subscriptions, host) {
179
+ if (child instanceof DomElementNode) {
180
+ if (this.isTemplateRefName(child)) {
181
+ const templateRefName = child.templateRefName;
182
+ const templateRef = new TemplateRefImpl(this, new DomFragmentNode(child.children), contextStack.copyStack(), []);
183
+ this.templateNameScope.set(templateRefName.name, templateRef);
184
+ return;
185
+ }
186
+ fragmentParent.append(this.createElement(child, contextStack, parentNode, subscriptions, host));
187
+ }
188
+ else if (child instanceof DomStructuralDirectiveNode) {
189
+ const commentText = child.name + (typeof child.value == 'string' ? (' = ' + child.value) : '');
190
+ const comment = document.createComment(`start ${commentText}`);
191
+ fragmentParent.append(comment);
192
+ const lastComment = document.createComment(`end ${commentText}`);
190
193
  comment.after(lastComment);
191
- this.createDirective(child, comment, contextStack, parent);
194
+ this.createStructuralDirective(child, comment, contextStack, parentNode, host);
192
195
  }
193
- else if (child instanceof LiveTextContent) {
194
- parent.append(this.createLiveText(child, contextStack));
196
+ else if (isLiveTextContent(child)) {
197
+ fragmentParent.append(this.createLiveText(child, contextStack, parentNode, subscriptions));
195
198
  }
196
199
  else if (child instanceof TextContent) {
197
- parent.append(this.createText(child));
200
+ fragmentParent.append(this.createText(child));
198
201
  }
199
202
  else if (child instanceof CommentNode) {
200
- parent.append(this.createComment(child));
203
+ fragmentParent.append(this.createComment(child));
201
204
  }
202
- else if (child instanceof DOMFragmentNode) {
203
- parent.append(this.createDocumentFragment(child, contextStack));
205
+ else if (child instanceof DomFragmentNode) {
206
+ fragmentParent.append(this.createDocumentFragment(child, contextStack, parentNode, subscriptions, host));
204
207
  }
205
208
  }
206
209
  createElementByTagName(node) {
@@ -228,28 +231,53 @@ export class ComponentRender {
228
231
  }
229
232
  return element;
230
233
  }
231
- createElement(node, contextStack) {
234
+ createElement(node, contextStack, parentNode, subscriptions, host) {
232
235
  const element = this.createElementByTagName(node);
233
- const elContext = isHTMLComponent(element) ? element._viewScope : new ElementReactiveScope(element);
234
- contextStack = contextStack.copyStack();
235
- contextStack.pushScope(elContext);
236
- this.initAttribute(element, node, contextStack);
237
- if (node.templateRefName) {
238
- Reflect.set(this.view, node.templateRefName.name, element);
239
- const view = this.componentRef.viewChild.find(child => child.selector === node.templateRefName.name);
236
+ const elementStack = contextStack.copyStack();
237
+ const elementScope = isHTMLComponent(element) ? element._viewScope : elementStack.pushBlockReactiveScopeFor({ 'this': element });
238
+ elementStack.pushScope(elementScope);
239
+ if (node.attributeDirectives?.length) {
240
+ node.attributeDirectives.forEach(directiveNode => {
241
+ const directiveRef = ClassRegistryProvider.getDirectiveRef(directiveNode.name);
242
+ if (directiveRef && directiveRef.modelClass.prototype instanceof AttributeDirective) {
243
+ const directive = new directiveRef.modelClass(element);
244
+ const stack = contextStack.copyStack();
245
+ stack.pushBlockReactiveScopeFor({ 'this': directive });
246
+ const directiveSubscriptions = this.initDirectiveAttributes(directive, directiveNode, stack);
247
+ subscriptions.push(...directiveSubscriptions);
248
+ if (isOnInit(directive)) {
249
+ directive.onInit();
250
+ }
251
+ }
252
+ });
253
+ }
254
+ const attributesSubscriptions = this.initAttribute(element, node, elementStack);
255
+ subscriptions.push(...attributesSubscriptions);
256
+ const eventName = getInputEventName(element);
257
+ let listener;
258
+ if (eventName) {
259
+ const inputScope = elementScope.getScopeOrCreat('this');
260
+ listener = (event) => inputScope.emit('value', element.value);
261
+ element.addEventListener(eventName, listener);
262
+ }
263
+ const templateRefName = node.templateRefName;
264
+ if (templateRefName) {
265
+ Reflect.set(this.view, templateRefName.name, element);
266
+ const view = this.componentRef.viewChild.find(child => child.selector === templateRefName.name);
240
267
  if (view) {
241
268
  Reflect.set(this.view._model, view.modelName, element);
242
269
  }
243
270
  }
244
271
  if (node.children) {
245
272
  for (const child of node.children) {
246
- this.appendChildToParent(element, child, contextStack);
273
+ this.appendChildToParent(element, child, elementStack, element, subscriptions, host);
247
274
  }
248
275
  }
249
276
  return element;
250
277
  }
251
278
  initAttribute(element, node, contextStack) {
252
- if (node.attributes) {
279
+ const subscriptions = [];
280
+ if (node.attributes?.length) {
253
281
  node.attributes.forEach(attr => {
254
282
  const isAttr = hasAttr(element, attr.name);
255
283
  if (isAttr) {
@@ -268,17 +296,21 @@ export class ComponentRender {
268
296
  }
269
297
  });
270
298
  }
271
- if (node.twoWayBinding) {
299
+ if (node.twoWayBinding?.length) {
272
300
  node.twoWayBinding.forEach(attr => {
273
- this.bind2Way(element, attr, contextStack);
301
+ const sub = attr.expression.subscribe(contextStack);
302
+ subscriptions.push(...sub);
303
+ attr.expression.get(contextStack);
274
304
  });
275
305
  }
276
- if (node.inputs) {
306
+ if (node.inputs?.length) {
277
307
  node.inputs.forEach(attr => {
278
- this.bind1Way(element, attr, contextStack);
308
+ const sub = attr.expression.subscribe(contextStack, attr.pipelineNames);
309
+ subscriptions.push(...sub);
310
+ attr.expression.get(contextStack);
279
311
  });
280
312
  }
281
- if (node.outputs) {
313
+ if (node.outputs?.length) {
282
314
  node.outputs.forEach(event => {
283
315
  let listener;
284
316
  if (typeof event.value === 'string') {
@@ -294,94 +326,52 @@ export class ComponentRender {
294
326
  element.addEventListener(event.name, listener);
295
327
  });
296
328
  }
297
- if (node.templateAttrs) {
329
+ if (node.templateAttrs?.length) {
298
330
  node.templateAttrs.forEach(attr => {
299
- this.bind1Way(element, attr, contextStack);
331
+ const sub = attr.expression.subscribe(contextStack);
332
+ subscriptions.push(...sub);
333
+ attr.expression.get(contextStack);
300
334
  });
301
335
  }
336
+ return subscriptions;
302
337
  }
303
- bind1Way(element, attr, contextStack) {
304
- const callback = () => {
305
- attr.expression.get(contextStack);
306
- };
307
- this.subscribeExpressionNode(attr.expression, contextStack, callback, element, attr.name, attr.expressionEvent);
308
- callback();
309
- }
310
- subscribeExpressionNode(node, contextStack, callback, object, attrName, events) {
311
- events ??= node.events();
312
- const scopeMap = findScopeMap(events, contextStack);
313
- scopeMap.forEach((scope, eventName) => {
314
- const context = scope.getContext();
315
- if (context) {
316
- if (AsyncPipeProvider.AsyncPipeContext === context) {
317
- const pipe = contextStack.get(eventName);
318
- subscribe1way(pipe, eventName, callback, object, attrName);
319
- if (isOnDestroy(pipe)) {
320
- this.view._model.subscribeModel('destroy', () => {
321
- if (isModel(pipe)) {
322
- pipe.emitChangeModel('destroy');
323
- }
324
- pipe.onDestroy();
325
- });
326
- }
327
- const pipeContext = {};
328
- pipeContext[eventName] = (value, ...args) => pipe.transform(value, ...args);
329
- contextStack.pushBlockScopeFor(pipeContext);
330
- }
331
- else if (PipeProvider.PipeContext !== context) {
332
- subscribe1way(context, eventName, callback, object, attrName);
333
- }
334
- }
335
- });
336
- }
337
- bind2Way(element, attr, contextStack) {
338
- const callback1 = () => {
339
- attr.expression.get(contextStack);
340
- };
341
- const callback2 = () => {
342
- attr.callbackExpression.get(contextStack);
343
- };
344
- const scopeMap = findScopeMap(attr.expressionEvent, contextStack);
345
- scopeMap.forEach((scope, eventName) => {
346
- const context = scope.getContext();
347
- if (context) {
348
- if (AsyncPipeProvider.AsyncPipeContext === context) {
349
- const pipe = contextStack.get(eventName);
350
- subscribe2way(pipe, eventName, callback1, element, attr.name, callback2);
351
- if (isOnDestroy(pipe)) {
352
- this.view._model.subscribeModel('destroy', () => {
353
- if (isModel(pipe)) {
354
- pipe.emitChangeModel('destroy');
355
- }
356
- pipe.onDestroy();
357
- });
358
- }
359
- const pipeContext = {};
360
- pipeContext[eventName] = (value, ...args) => pipe.transform(value, ...args);
361
- contextStack.pushBlockScopeFor(pipeContext);
362
- }
363
- else if (PipeProvider.PipeContext !== context) {
364
- subscribe2way(context, eventName, callback1, element, attr.name, callback2);
365
- }
366
- }
367
- });
368
- callback1();
369
- const changeEventName = getChangeEventName(element, attr.name);
370
- if ((changeEventName === 'input' || changeEventName === 'change')
371
- && isModel(element)) {
372
- element.addEventListener(changeEventName, () => {
373
- element.emitChangeModel(attr.name);
338
+ initDirectiveAttributes(directive, node, contextStack) {
339
+ const subscriptions = [];
340
+ if (node.attributes?.length) {
341
+ node.attributes.forEach(attr => Reflect.set(directive, attr.name, attr.value));
342
+ }
343
+ if (node.twoWayBinding?.length) {
344
+ node.twoWayBinding.forEach(attr => {
345
+ const sub = attr.expression.subscribe(contextStack);
346
+ subscriptions.push(...sub);
347
+ attr.expression.get(contextStack);
374
348
  });
375
349
  }
376
- else if (isHTMLComponent(element)) {
350
+ if (node.inputs?.length) {
351
+ node.inputs.forEach(attr => {
352
+ const sub = attr.expression.subscribe(contextStack, attr.pipelineNames);
353
+ subscriptions.push(...sub);
354
+ attr.expression.get(contextStack);
355
+ });
377
356
  }
378
- else {
379
- this.nativeElementMutation.subscribe(element, attr.name, () => {
380
- if (isModel(element)) {
381
- element.emitChangeModel(attr.name);
382
- }
357
+ if (node.outputs?.length) {
358
+ node.outputs.forEach(event => {
359
+ const listener = ($event) => {
360
+ const stack = contextStack.copyStack();
361
+ stack.pushBlockScopeFor({ $event });
362
+ event.expression.get(stack, this.view._proxyModel);
363
+ };
364
+ directive[event.name].subscribe(listener);
365
+ });
366
+ }
367
+ if (node.templateAttrs?.length) {
368
+ node.templateAttrs.forEach(attr => {
369
+ const sub = attr.expression.subscribe(contextStack);
370
+ subscriptions.push(...sub);
371
+ attr.expression.get(contextStack);
383
372
  });
384
373
  }
374
+ return subscriptions;
385
375
  }
386
376
  }
387
377
  //# 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 { ExpressionEventMap, 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';\nimport { findScopeMap } from './events.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\tthis.nativeElementMutation = new ElementMutation();\n\t\tthis.view._model.subscribeModel('destroy', () => {\n\t\t\tthis.nativeElementMutation.disconnect();\n\t\t});\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\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 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\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\taddChangeListener(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\tcreateDirective(directive: DOMDirectiveNode<ExpressionNode>, comment: Comment, directiveStack: Stack, parentNode: Node): 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.nativeElementMutation.subscribeOnRemoveNode(parentNode, comment, () => {\n\t\t\t\t\tstructural.onDestroy();\n\t\t\t\t});\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, parent);\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._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) {\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, attr.expressionEvent);\n\t\tcallback();\n\t}\n\tsubscribeExpressionNode(node: ExpressionNode, contextStack: Stack, callback: SourceFollowerCallback, object?: object, attrName?: string, events?: ExpressionEventMap) {\n\t\tevents ??= node.events();\n\t\tconst scopeMap = findScopeMap(events, contextStack);\n\t\tscopeMap.forEach((scope, eventName) => {\n\t\t\tconst context = scope.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', () => {\n\t\t\t\t\t\t\tif (isModel(pipe)) {\n\t\t\t\t\t\t\t\tpipe.emitChangeModel('destroy');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpipe.onDestroy();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst pipeContext: { [key: string]: Function; } = {};\n\t\t\t\t\tpipeContext[eventName] = (value: any, ...args: any[]) => pipe.transform(value, ...args);\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\tconst scopeMap = findScopeMap(attr.expressionEvent, contextStack);\n\t\tscopeMap.forEach((scope, eventName) => {\n\t\t\tconst context = scope.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', () => {\n\t\t\t\t\t\t\tif (isModel(pipe)) {\n\t\t\t\t\t\t\t\tpipe.emitChangeModel('destroy');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpipe.onDestroy();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst pipeContext: { [key: string]: Function } = {};\n\t\t\t\t\tpipeContext[eventName] = (value: any, ...args: any[]) => pipe.transform(value, ...args);\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\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 { 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 { 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\tprivate componentRef: ComponentRef<T>;\n\tprivate template: DomNode;\n\tprivate contextStack: Stack;\n\tprivate templateNameScope: ReactiveScope<{ [templateName: string]: TemplateRef }>;\n\n\tconstructor(public view: HTMLComponent<T>, private subscriptions: ScopeSubscription<ScopeContext>[]) {\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}\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, this.subscriptions, this.view);\n\t\t\t} else {\n\t\t\t\trootFragment = document.createDocumentFragment();\n\t\t\t\tthis.appendChildToParent(rootFragment, this.template, this.contextStack, rootRef, this.subscriptions, this.view);\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, host: HTMLComponent<any> | StructuralDirective): void {\n\t\tconst directiveRef = ClassRegistryProvider.getDirectiveRef<T>(directive.name);\n\t\tif (directiveRef) {\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\t// structural directive selector\n\t\t\tconst StructuralDirectiveClass = directiveRef.modelClass as typeof StructuralDirective;\n\t\t\tconst structural = new StructuralDirectiveClass(\n\t\t\t\ttemplateRef,\n\t\t\t\tviewContainerRef,\n\t\t\t\thost\n\t\t\t);\n\t\t\ttemplateRef.host = structural;\n\t\t\tstack.pushBlockReactiveScopeFor({ 'this': structural });\n\t\t\tconst subscriptions = this.initDirectiveAttributes(structural, directive, stack);\n\t\t\t// const 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, subscriptions: ScopeSubscription<ScopeContext>[]): Text {\n\t\tconst liveText = new Text('');\n\t\tcontextStack = contextStack.copyStack();\n\t\tcontextStack.pushBlockScopeFor({ this: liveText });\n\t\tconst textSubscriptions = textNode.expression.subscribe(contextStack, textNode.pipelineNames);\n\t\tsubscriptions.push(...textSubscriptions);\n\t\ttextNode.expression.get(contextStack);\n\t\treturn liveText;\n\t}\n\tcreateDocumentFragment(node: DomFragmentNode, contextStack: Stack, parentNode: Node, subscriptions: ScopeSubscription<ScopeContext>[], host: HTMLComponent<any> | StructuralDirective): DocumentFragment {\n\t\tconst fragment = document.createDocumentFragment();\n\t\tnode.children?.forEach(child => this.appendChildToParent(fragment, child, contextStack, parentNode, subscriptions, host));\n\t\treturn fragment;\n\t}\n\tappendChildToParent(fragmentParent: HTMLElement | DocumentFragment, child: DomNode, contextStack: Stack, parentNode: Node, subscriptions: ScopeSubscription<ScopeContext>[], host: HTMLComponent<any> | StructuralDirective) {\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, subscriptions, host));\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, host);\n\t\t} else if (isLiveTextContent(child)) {\n\t\t\tfragmentParent.append(this.createLiveText(child, contextStack, parentNode, subscriptions));\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, subscriptions, host));\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, subscriptions: ScopeSubscription<ScopeContext>[], host: HTMLComponent<any> | StructuralDirective): 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\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\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, subscriptions, host);\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;